【问题标题】:Haskell - span elem: evaluationHaskell - span elem:评估
【发布时间】:2014-10-19 17:58:46
【问题描述】:

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

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

结果是

("BOB","sidneyMORGANeddy")

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

【问题讨论】:

  • 它在s 处拆分,因为这是'A'..'Z' 集合中not 的第一个字母。

标签: haskell evaluation


【解决方案1】:

span 将使用谓词将列表分成两部分,其中第一部分是给定谓词成立的最长前缀,第二部分是列表的其余部分。换句话说,对于相同的谓词,第一部分是像takeWhile一样获得,第二部分是像dropWhile一样获得。

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

x `elem` xs

elem x xs 相同。因此,

`elem` xs

被视为中缀函数的部分。和\x -> elem x xs一样。

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

【讨论】: