-1

我是 Haskell 的新手,在处理小程序时,我发现关于 lambda 函数的功能几乎没有混淆。

lastThat :: (a -> Bool) -> a -> [a] -> a   
lastThat f = foldl (\x acc -> if f x then x else acc)

执行lastThat (>0) 100 [-1,-4,5,7,9,-10]我得到 100 。在使用以下定义时

lastThat :: (a -> Bool) -> a -> [a] -> a   
lastThat f = foldl (\acc x -> if f x then x else acc)

& 然后执行lastThat (>0) 100 [-1,-4,5,7,9,-10]我得到了 9 的预期。

为什么它不适用于第一个定义?

4

1 回答 1

0

foldl 和 foldr 都从左到右遍历列表,但区别在于 foldl 是左关联的,而 foldr 是右关联的

以列表形式给出 (xs)

xs = 1, 2, 3, ....., n

像 foldl 一样思考将初始值放在左侧并将括号关联到左侧。

acc = 0
op = +
(((...(0 + 1) + 2) + 3) + 4) ..... + n)

foldr 将初始值放在右侧并将括号关联到右侧。

acc = 0
op = +
(1 + (2 + (3 + ......+ (n + 0)))...)))
于 2019-12-22T03:15:18.127 回答