我想知道为什么这个表达式不会导致 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/