[英]Haskell foldl and stack overflow?
我讀了一篇帖子聲稱foldl
可能很容易發生堆棧溢出。 發布示例代碼是:
maximum [1..1000000]
代碼不會在我的機器中溢出。 但它可能因環境而異。 我增加了這樣的數字:
maximum [1..1000000000]
它導致硬盤交換,所以我不得不停止評估。 示例代碼並不重要。 堆棧溢出真的發生了嗎? 或者只是一個過去的故事?
foldr
不是尾遞歸的 foldl
是尾遞歸和懶惰的,所以它可以溢出 foldl'
是尾遞歸和嚴格的,所以它是安全的 Data.List.maximum使用惰性foldl1
。 如果列表包含Int
或Integer
,則使用strictMaximum
(使用strict foldl1'
實現)的規則。
因此,使用optimisations編譯的以下程序不會導致堆棧溢出:
main = print $ maximum [1..1000000000]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.