Haskell - span elem:评估

tum*_*ler 4 evaluation haskell

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

span (`elem` ['A'..'Z']) "BOBsidneyMORGANeddy"
Run Code Online (Sandbox Code Playgroud)

结果是

("BOB","sidneyMORGANeddy")
Run Code Online (Sandbox Code Playgroud)

谁能解释我的评估过程?因为我不知道为什么它如上所述分裂.

Sas*_* NF 7

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

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

x `elem` xs
Run Code Online (Sandbox Code Playgroud)

是一样的elem x xs.因此,

`elem` xs
Run Code Online (Sandbox Code Playgroud)

被视为中缀函数的一部分.它是一样的\x -> elem x xs.

你现在可以看到span给出一个谓词测试是否可以在列表中找到要拆分的列表的元素['A'..'Z'].因此,它会将列表拆分为两个:它找到谓词不能保存的第一个元素,这就是拆分点.这是第二个分区以第一个小写字母开头的方式.