【发布时间】:2023-03-05 22:13:01
【问题描述】:
Learn You a Haskell 谈到 foldl' 作为 foldl 的替代品,因为 foldl 容易发生堆栈溢出。
- 根据 LYAH,
foldl (+) 0 (replicate 1000000 1)应该堆栈溢出,但它不会在我的机器上。 为什么不呢?即使我将这个数字增加到 1000 万,它也不会溢出。它只会占用大量内存,直到我的 OS X 计算机无法使用,我必须重新启动它。 - 在什么情况下我应该使用
foldl而不是foldl'?根据我的经验,foldl'“正常工作”,而foldl基本上可以让我的计算机崩溃(见上文)。 - 我不明白为什么
foldr没有类似的东西。为什么foldr不能堆栈溢出,为什么没有foldr'?
【问题讨论】:
-
第二个和第三个问题的答案在haskell.org/haskellwiki/Foldr_Foldl_Foldl'等着你
-
计算机遇到堆栈溢出或内存不足的确切时间取决于您的操作系统、您正在运行的其他程序以及您的物理硬件。例如,树莓派会比图形渲染计算机(可能有 >100GB 的 RAM)更快地耗尽 RAM。您的操作系统也可能以特定方式使用交换来管理请求更多内存的程序。
-
快速而肮脏的
answers假设: 1. 不确定,您是否有任何优化? 2. 始终使用 foldl'!这是一个经验法则。 3. foldr 是惰性的(顺便说一句,它可以在无限列表上工作),所以 IIRC 它甚至没有一个严格的累加器(它不是尾递归)。 -
Haskell中左右折叠的区别也有很多资源,包括many questions on SO already。
标签: haskell stack-overflow fold