簡體   English   中英

Haskell foldl和堆棧溢出?

[英]Haskell foldl and stack overflow?

我讀了一篇帖子聲稱foldl可能很容易發生堆棧溢出。 發布示例代碼是:

maximum [1..1000000]

代碼不會在我的機器中溢出。 但它可能因環境而異。 我增加了這樣的數字:

maximum [1..1000000000]

它導致硬盤交換,所以我不得不停止評估。 示例代碼並不重要。 堆棧溢出真的發生了嗎? 或者只是一個過去的故事?

有些觀點

  • 遞歸函數在每次調用中占用堆棧空間,因此深層嵌套調用將導致溢出
  • 尾遞歸函數可以針對迭代進行優化,因此不會溢出
  • foldr 不是尾遞歸的
  • 延遲評估可以防止優化尾遞歸函數
  • foldl是尾遞歸和懶惰的,所以它可以溢出
  • foldl'是尾遞歸和嚴格的,所以它是安全的

Data.List.maximum使用惰性foldl1 如果列表包含IntInteger ,則使用strictMaximum (使用strict foldl1'實現)的規則。

因此,使用optimisations編譯的以下程序不會導致堆棧溢出:

main = print $ maximum [1..1000000000]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM