【发布时间】:2015-03-07 16:15:00
【问题描述】:
我对列表中 foldl 与 foldr 的理解:
如果我们正确折叠 [0,1,2,3] 并使用函数 s 和起始累加器 a,我们正在这样做:
f 0 (f 1 (f 2 (f 3 a)))
如果我们 left 折叠 [0,1,2,3] 并带有函数 s 和起始累加器 a,我们正在这样做:
f (f (f (f 0 a) 1) 2) 3)
给定:
elem_r :: (Eq a) => a -> [a] -> Bool
elem_r y ys = foldr (\x acc -> if x == y then True else acc) False ys
和
elem_l :: (Eq a) => a -> [a] -> Bool
elem_l y ys = foldl (\acc x -> if x == y then True else acc) False ys
在我看来,elem_r 3 [0..] 将计算它真正必须的值,并在达到 3 值时立即返回 True。
f 0 (f 1 (f 2 (f 3 (...)))
而elem_l 3 [0..] 需要在返回结果之前评估完整的嵌套函数应用程序。
f (f (f (f (f 0 3) 1) 2) 3) ...)
现在我的问题是:
在elem_l 0 [0..]的具体情况下
搜索到的元素是列表的第一项。
在这个表达式中:
f (f (f (f (f 0 0) 1) 2) 3) ...)
最里面的函数 (f 0 0) 可以立即被评估为“真”。
为什么 Haskell 继续评估其余的嵌套函数?
【问题讨论】:
-
if x == y then True else acc可能会像acc || x == y一样整洁一些,恕我直言。 -
@BartekBanachewicz 你的意思是
x == y || acc,毫无疑问。
标签: haskell functional-programming fold