关于在列表上使用foldl和foldr,我的理解如下:
如果我们使用函数s和一个起始累加器a从右侧对[0,1,2,3] 进行折叠,那么我们正在执行以下操作:
f 0 (f 1 (f 2 (f 3 a)))
如果我们使用函数s和一个起始累加器a从左侧对[0,1,2,3] 进行折叠,那么我们正在执行以下操作:
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为什么还要继续评估其余嵌套函数?
acc || x == y
。 - Bartek Banachewiczx == y || acc
。 - Will Ness