Haskell thunk - foldl vs foldr

时间:2013-02-06 10:16:45

标签: haskell

学习Haskell,我发现foldl创建了thunk并可能导致堆栈崩溃这一事实,因此最好使用foldl'中的Data.List。为什么只是foldl,而不是foldr

由于

1 个答案:

答案 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。

但总的来说,在查看第二个参数之前,您正在使用foldrf添加惰性函数,这些函数已经可以执行某些操作(例如生成列表构造函数)。

foldr与严格f(例如(+))一起使用会产生不必要的影响,即将所有应用程序放在堆栈上,直到达到列表末尾为止;显然不是你想要的,而不是一个看起来很foldr'可以帮助的情况。