学习 Haskell 时,我遇到了foldl
创建 thunk 并可能使堆栈崩溃的事实,因此最好使用foldl'
from Data.List
. 为什么它只是foldl
,而不是,例如,foldr
?
谢谢
学习 Haskell 时,我遇到了foldl
创建 thunk 并可能使堆栈崩溃的事实,因此最好使用foldl'
from Data.List
. 为什么它只是foldl
,而不是,例如,foldr
?
谢谢
没有必要,foldr'
因为你可以自己造成效果。
原因如下:考虑foldl f 0 [1,2,3]
。这将扩展为f (f (f 0 1) 2) 3
,因此当您恢复使用任何内容(f 0 1)
时,需要创建并(f (f 0 1) 2)
创建。如果您想避免这种情况(通过在继续之前评估这些子表达式),您必须指示foldl
为您执行此操作 - 即foldl'
.
有了foldr
,事情就不同了。你得到的foldr f 0 [1, 2, 3]
是f 1 (foldr f 0 [2, 3])
(括号中的表达式是一个重击)。如果您想评估 的(部分)外部应用程序f
,您现在可以执行此操作,而无需先创建线性数量的 thunk。
但一般来说,在查看第二个参数之前,您正在使用foldr
惰性函数,因为它已经可以做一些事情(例如生成列表构造函数)。f
foldr
与 strict 一起使用f
(例如(+)
)具有将所有应用程序放入堆栈直到到达列表末尾的不良影响;显然不是您想要的,也不是看起来foldr'
可以提供帮助的情况。