在 Haskell 中 有很多关于、和的好问题和答案。foldl
foldr
foldl'
所以现在我知道:
1)foldl
很懒
2)不要使用foldl
,因为它会炸毁堆栈
3)使用foldl'
,因为它很严格(ish)
如何foldl
评估:
1)创建了一大堆 thunk
2)在 Haskell 完成创建 thunk 后,thunk 减少了
3)如果有太多 thunk 则溢出堆栈
我感到困惑的是:
1)为什么在所有重击之后必须发生减少?
2)为什么不foldl
评估就像foldl'
?这只是实现的副作用吗?
3) 从定义来看,foldl
它看起来可以使用尾递归来有效地评估——我如何判断一个函数是否真的会被有效地评估?如果我不想让我的程序崩溃,我似乎不得不开始担心 Haskell 中的评估顺序。
提前致谢。我不知道我对评估的理解foldl
是否正确-如有必要,请提出更正。
更新:看来我的问题的答案与范式、弱范式和头部范式以及 Haskell 对它们的实现有关。
但是,我仍在寻找一个示例,其中更急切地评估组合函数会导致不同的结果(崩溃或不必要的评估)。