我想知道为什么这个表达式不会导致GHCi中的堆栈溢出:
foldr (+) 0 [1..5000000] -- 12500002500000
显然,(+)
在两个论点中都是严格的,因此必须立即遍历整个列表,而且懒惰并没有帮助。
我的第一个想法是编译器会将(+)
识别为关联操作并将其转换为尾递归。
但是,以下操作也可以正常工作:
foldr (-) 0 [1..5000000] -- -2500000
这里发生了什么?
答案 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