学习 Haskell,我发现 foldl
创建 thunk 并可能使堆栈崩溃,因此最好使用 foldl'
来自 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])
(括号中的表达式是一个 thunk)。如果您想评估 f
的(部分)外部应用程序,您现在可以执行此操作,而无需先创建线性数量的 thunk。
但总的来说,您使用的是 foldr
带有 f
的惰性函数在查看第二个参数之前已经可以做一些事情(例如生成列表构造函数)。
使用 foldr
严格的f
(例如 (+)
)具有将所有应用程序放入堆栈直到到达列表末尾的不良影响;显然不是您想要的,也不是看起来很 foldr'
的情况有帮助。
关于Haskell thunks - foldl vs foldr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14726499/