haskell - 为什么在两个参数中应用于严格函数的foldr 不会导致堆栈溢出?

标签 haskell recursion stack-overflow fold

我想知道为什么这个表达式不会导致 GHCi 中的堆栈溢出:

foldr (+) 0 [1..5000000] -- 12500002500000

显然,(+) 的两个参数都很严格,因此必须立即遍历整个列表,而懒惰无济于事。

我的第一个想法是编译器会将 (+) 识别为关联操作并将其转换为尾递归。

但是,以下操作也有效:

foldr (-) 0 [1..5000000] -- -2500000

这里发生了什么?

最佳答案

GHC 最新的运行时系统允许其堆栈动态增长。尝试限制它,您将看到堆栈溢出:

% ghci +RTS -K512K
GHCi, version 8.2.2: http://www.haskell.org/ghc/  :? for help
Prelude> foldr (+) 0 [1..5000000]
*** Exception: stack overflow

关于haskell - 为什么在两个参数中应用于严格函数的foldr 不会导致堆栈溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50410516/

相关文章:

haskell - 如何在 Morte 上表示任意 GADT?

haskell - Haskell 中 `->` 、 `=` 和 ` ` 的优先级是多少?

c# - 实例化时的 StackOverflow 错误

c# - 追踪我的 LINQ 查询中的堆栈溢出错误

java - FunctionJava 应用程序在堆栈跟踪中抛出 StackOverflowError 和 Stream

c++ - Haskell FFI 导出的 const 注释

javascript - 排序递归函数导致数组的数组

list - 在 Haskell 中取出列表中某个元素的最后一次出现

c++ - 构建 vector 的递归函数,将返回什么?

haskell - 是否存在使用代数数据类型或多态性的 OOP 抽象类的 Haskell 等效项?