Haskell 折叠和堆栈溢出?
我读到一篇文章声称 foldl
可能很容易发生堆栈溢出。发布的示例代码是:
maximum [1..1000000]
代码在我的机器中没有溢出。然而,它可能因环境而异。我这样增加了数字:
maximum [1..1000000000]
它导致了硬盘交换,所以我不得不停止评估。 示例代码并不重要。真的会发生堆栈溢出吗?或者只是一个古老的故事?
I read a posting claims foldl
may occur stack overflow easily. And the posting sample code was:
maximum [1..1000000]
The code doesn't overflown in my machine. However it can vary by environment. I increased number like this:
maximum [1..1000000000]
it caused hard disk swapping, so I have to stop evaluation.
Sample code is not important. Is it really occur stack overflow? Or just an old days story?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
一些要点
foldr
是不是尾递归foldl
是尾递归且惰性的,因此它可以溢出foldl'
是尾递归且严格,所以很安全Some points
foldr
is not tail-recursivefoldl
is tail-recursive and lazy, so it can overflowfoldl'
is tail-recursive and strict, so it's safeData.List.maximum 是使用惰性
foldl1
实现的。如果列表包含Int
或Integer
,则有一条使用strictMaximum
的规则(使用严格的foldl1'
实现) 。因此,经过优化编译的以下程序不会导致堆栈溢出:
Data.List.maximum is implemented using the lazy
foldl1
. There is a rule to usestrictMaximum
(implemented using the strictfoldl1'
) if the list containsInt
orInteger
.So, the following program compiled with optimisations does not cause a stack overflow: