6

学习 Haskell 时,我遇到了foldl创建 thunk 并可能使堆栈崩溃的事实,因此最好使用foldl'from Data.List. 为什么它只是foldl,而不是,例如,foldr

谢谢

4

1 回答 1

11

没有必要,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'可以提供帮助的情况。

于 2013-02-06T10:29:51.927 回答