学习Haskell,我发现foldl
创建了thunk并可能导致堆栈崩溃这一事实,因此最好使用foldl'
中的Data.List
。为什么只是foldl
,而不是foldr
?
由于
答案 0 :(得分:10)
不需要foldr'
因为您可以自己产生效果。
原因如下:考虑foldl f 0 [1,2,3]
。这会扩展为f (f (f 0 1) 2) 3
,因此当您将任何恢复使用时,必须创建(f 0 1)
和(f (f 0 1) 2)
的thunk。如果您想避免这种情况(通过在继续之前评估这些子表达式),您必须指示foldl
为您执行此操作 - 即foldl'
。
使用foldr
,情况有所不同。你从foldr f 0 [1, 2, 3]
得到的是f 1 (foldr f 0 [2, 3])
(括号中的表达式是thunk)。如果要评估f
的外部应用程序(部分),可以立即执行此操作,而不会首先创建线性数量的thunk。
但总的来说,在查看第二个参数之前,您正在使用foldr
为f
添加惰性函数,这些函数已经可以执行某些操作(例如生成列表构造函数)。
将foldr
与严格f
(例如(+)
)一起使用会产生不必要的影响,即将所有应用程序放在堆栈上,直到达到列表末尾为止;显然不是你想要的,而不是一个看起来很foldr'
可以帮助的情况。