无限列表上的foldl行为

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继续评估其余的嵌套函数?

kos*_*kus 7

即使你"立即"减少f 0 0True,也没有帮助.你仍然有所有周围的事件f减少...