gpt4 book ai didi

haskell - Foldl 是如何偷懒的?

转载 作者:行者123 更新时间:2023-12-02 08:15:15 25 4
gpt4 key购买 nike

有很多good questions and answers关于 Haskell 中的 foldlfoldrfoldl'

所以现在我知道:
1) foldl 是懒惰的
2) 不要使用 foldl 因为它会炸毁堆栈
3) 使用 foldl' 因为它是严格的 ( ish )

如何评估foldl:
1) 创建了一大堆 thunk
2) Haskell 创建完 thunk 后,thunk 就会减少
3)如果thunk太多就会溢出堆栈

我感到困惑的是:
1) 为什么在所有 thunk-ing 之后必须进行归约?
2) 为什么 foldl 不像 foldl' 那样被评估?这只是实现的副作用吗?
3)来自definition , foldl 看起来可以使用尾递归有效地评估它——我如何判断一个函数是否实际上会被有效地评估?如果我不想让我的程序崩溃,我似乎必须开始担心 Haskell 中的评估顺序。

提前致谢。我不知道我对 foldl 评估的理解是否正确 - 如有必要,请提出更正建议。

<小时/>

更新:看起来我的问题的答案与范式、弱范式和头范式以及 Haskell 对它们的实现有关。
但是,我仍在寻找一个示例,其中更急切地评估组合函数会导致不同的结果(崩溃或不必要的评估)。

最佳答案

简短的回答是,在 foldl f 中,f 不一定是严格的,因此它可能过于渴望预先减少 thunks。然而,实际上通常是这样,所以您几乎总是希望使用 foldl'

我写了a more in-depth explanation of how the evaluation order of foldl and foldl' works on another question 。它相当长,但我认为它应该可以让您澄清一些事情。

关于haskell - Foldl 是如何偷懒的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7487455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com