为什么foldr应用于两个参数中的函数strict而不会导致堆栈溢出?

时间:2018-05-18 11:38:18

标签: haskell recursion stack-overflow fold

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

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

显然,(+)在两个论点中都是严格的,因此必须立即遍历整个列表,而且懒惰并没有帮助。

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

但是,以下操作也可以正常工作:

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

这里发生了什么?

1 个答案:

答案 0 :(得分:4)

GHC的最新运行时系统让它的堆栈动态增长。尝试限制它,你会看到你的堆栈溢出:

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