Haskell thunks - foldl vs foldr

标签 haskell

学习 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/

相关文章:

haskell - Haskell 中的树遍历

list - Haskell - 家庭作业 - 连接两个列表

python - Python 中的 Haskell 风格的递归惰性列表

haskell - Stack Haddock - 不要为依赖项生成文档

math - Haskell 中的数字域

haskell - 使用矢量的风格与性能

haskell - 我如何优化这个 haskell 函数

Haskell数据类型转换问题

haskell - 'do' 表示法中的新范围

haskell - 在 Haskell 中反转二进制数