关于折叠和堆栈溢出的问题

sta*_*ser 7 stack-overflow haskell fold

了解你Haskell的谈论foldl'作为一种替代foldl,因为foldl很容易出现堆栈溢出.

  • 据LYAH说,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

这是一个如何工作的描述:

线程堆栈(包括主线程的堆栈)存在于堆上.随着堆栈的增长,根据需要添加新的堆栈块; 如果堆栈再次收缩,这些额外的堆栈块将被垃圾收集器回收.默认的初始堆栈大小是故意小的,以便将创建线程的时间和空间开销保持在最低限度,并使得即使是很小的工作也可以生成线程.