2014-10-19 37 views
3

我想知道haskell如何忽略以下表达式。Haskell - span elem:评估

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

结果是

("BOB","sidneyMORGANeddy") 

任何人都可以解释我的评估过程?因为我不能说出它为什么像上面那样分裂。

+0

它在's'处被分割,因为这是第一个字母,它不是集合'A'。'Z''中的_not_。 – MathematicalOrchid 2014-10-20 11:31:35

回答

6

span将使用谓词将列表分成两部分,第一部分是给定谓词成立的最长前缀,第二部分是列表的其余部分。换言之,第一部分与takeWhile一样获得,第二部分与dropWhile一样获得相同的谓词。

现在让我们来看看谓词。 elem :: a->[a]->Bool指示给定元素是否在给定列表中找到。整洁的诀窍是,两个或多个参数的任何功能,可以在中间符号可以使用:

x `elem` xs 

相同elem x xs。因此,

`elem` xs 

被视为与中缀函数的部分一样。它与\x -> elem x xs相同。

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