我看了一篇帖子声明foldl
可能会发生堆栈溢出很容易。发布示例代码为:
maximum [1..1000000]
代码在我的机器中没有溢出。但它可能因环境而异。我增加了这样的数字:
maximum [1..1000000000]
它导致硬盘交换,所以我不得不停止评估。 示例代码并不重要。堆栈溢出真的发生了吗?或者只是一个过去的故事?
答案 0 :(得分:10)
foldr
不尾递归foldl
是尾递归和懒惰的,所以它可以溢出foldl'
是尾递归和严格的,所以它是安全的答案 1 :(得分:3)
使用惰性foldl1
实现Data.List.maximum。如果列表包含strictMaximum
或foldl1'
,则有使用Int
(使用严格Integer
实施)的规则。
因此,使用optimisations编译的以下程序不会导致堆栈溢出:
main = print $ maximum [1..1000000000]