我想知道haskell如何评估以下表达式。
span (`elem` ['A'..'Z']) "BOBsidneyMORGANeddy"
结果是
("BOB","sidneyMORGANeddy")
有人能解释我的评估过程吗?因为我不知道为什么它如上所述分裂。
答案 0 :(得分:7)
span
将使用谓词将列表分成两个,使得第一部分是给定谓词成立的最长前缀,第二部分是列表的其余部分。换句话说,第一部分与takeWhile
一样获得,第二部分与dropWhile
一样获得同一谓词。
现在让我们看看谓词。 elem :: a->[a]->Bool
告诉在给定列表中是否找到给定元素。巧妙的技巧是两个或多个参数的任何函数都可以在中缀表示法中使用:
x `elem` xs
与elem x xs
相同。因此,
`elem` xs
被视为中缀函数的一部分。它与\x -> elem x xs
相同。
您现在可以看到span
被赋予一个谓词,用于测试是否可以在列表['A'..'Z']
中找到要拆分的列表的元素。因此,它会将列表拆分为两个:它找到谓词不能保留的第一个元素,并且它是分割点。这是第二个分区以第一个小写字母开头的方式。