Haskell - 跨度 elem : evaluation

标签 haskell evaluation

我想知道haskell如何评估以下表达式。

span (`elem` ['A'..'Z']) "BOBsidneyMORGANeddy"

结果是

("BOB","sidneyMORGANeddy")

谁能给我解释一下评估过程吗?因为我不知道为什么要像上面那样分割。

最佳答案

span 将使用谓词将列表分为两部分,第一部分是给定谓词成立的最长前缀,第二部分是列表的其余部分。换句话说,对于同一谓词,第一部分的获取方式类似于 takeWhile,第二部分的获取方式类似于 dropWhile

现在让我们看看谓词。 elem::a->[a]->Bool 告诉给定元素是否在给定列表中找到。巧妙的技巧是任何两个或多个参数的函数都可以在中缀表示法中使用:

x `elem` xs

elem x xs相同。因此,

`elem` xs

的处理方式与中缀函数的部分相同。它与 \x -> elem x xs 相同。

现在您可以看到,span 被赋予了一个谓词,测试要拆分的列表的元素是否可以在列表中找到 ['A'..'Z'].因此它将把列表分成两部分:它找到谓词不成立的第一个元素,这就是分割点。这就是第二个分区以第一个小写字母开头的方式。

关于Haskell - 跨度 elem : evaluation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26453626/

相关文章:

haskell - 为什么 GHC 打印 15 元组而不打印 16 元组?

haskell - Opaleye 中的左连接

haskell - Monad和单线程有什么关系?

c - OR'd if 条件的评估

c++ - 十进制转二进制

opencv - FDDB评估代码

haskell - 是否可以在 Haskell 的库中编写自己的流融合?

haskell - (a -> IO b) 到 IO (a -> b) 的转换

javascript - 短路评估令

python - 如果找到零,python 乘法表达式的计算速度会更快吗?