我想知道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/