学习Haskell,我碰到的事实foldl产生的thunk,并可能会崩溃堆栈,所以最好使用foldl'从Data.List.为什么它只是foldl,而不是,例如,foldr?
谢谢
Joa*_*ner 10
没有必要,foldr'因为你可以自己造成这种效果.
原因如下:考虑一下foldl f 0 [1,2,3].这扩展到了f (f (f 0 1) 2) 3,所以当你得到任何东西回来工作时,thunk用于(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'情况.