esp*_*ern 4 haskell functional-programming fold
我对列表中的foldl与foldr的理解是:
如果我们右边用函数s和一个起始累加器a折叠[0,1,2,3],我们这样做:
f 0 (f 1 (f 2 (f 3 a)))
如果我们使用函数s和起始累加器a 保留 fold [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
Run Code Online (Sandbox Code Playgroud)
和
elem_l :: (Eq a) => a -> [a] -> Bool
elem_l y ys = foldl (\acc x -> if x == y then True else acc) False ys
Run Code Online (Sandbox Code Playgroud)
我似乎很清楚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)可以立即被评估为"True".为什么Haskell继续评估其余的嵌套函数?