Haskell foldl和堆栈溢出?

时间:2011-02-12 09:54:06

标签: haskell stack-overflow

我看了一篇帖子声明foldl可能会发生堆栈溢出很容易。发布示例代码为:

maximum [1..1000000]

代码在我的机器中没有溢出。但它可能因环境而异。我增加了这样的数字:

maximum [1..1000000000]

它导致硬盘交换,所以我不得不停止评估。 示例代码并不重要。堆栈溢出真的发生了吗?或者只是一个过去的故事?

2 个答案:

答案 0 :(得分:10)

一些要点

  • 递归函数在每次调用中占用堆栈空间,因此深层嵌套调用将导致溢出
  • 尾递归函数可以针对迭代进行优化,因此不会溢出
  • foldr 尾递归
  • 延迟评估可以防止优化尾递归函数
  • foldl是尾递归和懒惰的,所以它可以溢出
  • foldl'是尾递归和严格的,所以它是安全的

答案 1 :(得分:3)

使用惰性foldl1实现Data.List.maximum。如果列表包含strictMaximumfoldl1',则有使用Int(使用严格Integer实施)的规则。

因此,使用optimisations编译的以下程序不会导致堆栈溢出:

  

main = print $ maximum [1..1000000000]