【发布时间】:2021-02-19 14:31:38
【问题描述】:
我一直在练习匿名函数并得到以下结果:
takeWhile' :: (a -> Bool) -> [a] -> [a]
takeWhile' f xs = foldl (\x y z -> if (f x) && z then x : y else y) xs [] True
这基本上是对 Haskell 中的 takeWhile 函数的重写。
对于那些不知道的人,takeWhile 函数接受一个列表和一个函数,并返回一个新列表,其中包含原始列表中满足该函数的每个元素,直到其中一个给出 false。
从我的角度来看,一切似乎都是正确的,我有 3 个参数 xy 和 z 可以在我的匿名函数中使用,x 是数字列表,y 是我将插入每个元素的空列表和 z基本上是一个去抖动器,所以如果其中一个元素不符合要求,我们就不再插入。
然而 Haskell 给了我以下错误:
"Occurs check: cannot construct the infinite type: a ~ Bool -> [a]"
知道为什么吗?
【问题讨论】:
-
除非您打算将
xs用作函数列表并提供一个函数作为初始值,否则匿名函数只能接受两个参数。 -
我认为这需要是
foldr,因为这是折叠应用程序可以简化为 lambda 应用程序的唯一方法,允许提供第三个参数。 -
foldl有两个参数:累加器x和元素y。z在这里做什么?
标签: haskell lambda anonymous-function