sta*_*ser 7 stack-overflow haskell fold
了解你Haskell的谈论foldl'作为一种替代foldl,因为foldl很容易出现堆栈溢出.
foldl (+) 0 (replicate 1000000 1)应该堆叠溢出,但它不在我的机器上.为什么不?即使我将这个数字增加到1000万也不会溢出.它只占用大量内存,直到我的OS X计算机无法使用,我必须重新启动它.foldl而不是foldl'?根据我的经验foldl'"只是工作",而foldl基本上可能会崩溃我的电脑(见上文).foldr.为什么不能foldr堆栈溢出,为什么没有foldr'?Yur*_*ras 12
它不会因堆栈溢出而崩溃,因为默认情况下堆栈现在是无限的.也就是说,默认的GHC运行时行为是允许堆栈无限增长 - 没有绑定可以触发堆栈溢出错误.
https://ghc.haskell.org/trac/ghc/ticket/8189
这是一个如何工作的描述:
线程堆栈(包括主线程的堆栈)存在于堆上.随着堆栈的增长,根据需要添加新的堆栈块; 如果堆栈再次收缩,这些额外的堆栈块将被垃圾收集器回收.默认的初始堆栈大小是故意小的,以便将创建线程的时间和空间开销保持在最低限度,并使得即使是很小的工作也可以生成线程.