【发布时间】:2020-04-07 15:46:22
【问题描述】:
我是 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。
为什么它不适用于第一个定义?
【问题讨论】:
-
因为在前者
x是累加器,所以你在累加器上调用f。 -
当我使用第一个定义如下
firstThat :: (a-> Bool) -> a -> [a] -> a firstThat f = foldr (\x acc -> if f x then x else acc)的foldr时,我得到正确的结果为5但不是100。 -
但是累加器和元素的顺序在
foldr和foldl之间交换。 -
哦,明白了。谢谢@WillemVanOnsem
标签: haskell lambda functional-programming fold foldleft