我不知道爲什麼爲什麼s ++不會導致大s的堆棧溢出?
Prelude> head $ reverse $ [1..10000000] ++ [99]
99
不會導致堆棧溢出錯誤。在序幕++似乎直截了當和非尾遞歸:
(++) :: [a] -> [a] -> [a]
(++) [] ys = ys
(++) (x:xs) ys = x : xs ++ ys
編輯:起初,我以爲這個問題有什麼做的方式++中拉開序幕的定義,尤其是與重寫規則,因此問題繼續如下。討論表明,情況並非如此。我認爲現在一些懶惰的評估效果會導致代碼在沒有堆棧溢出的情況下運行,但我不太清楚如何。
所以就這樣,它應該會遇到堆棧溢出,對吧?所以我認爲它可能與遵循++的定義的ghc魔術有關:
{ - #RULES 「++」[〜1] forall xs ys。 xs ++ ys = augment(\ c n - > foldr c n xs)ys # - }
*這是否有助於避免堆棧溢出?可能有人提供了一些提示,這段代碼是怎麼回事?**
重寫規則不會在解釋器中觸發(除非您啓用它們)。 – 2010-05-19 22:12:29
@唐:謝謝,我沒有啓用它們。無論如何,我應該在輸入之前檢查一下:一個新函數「fst = if s == [] then t else let(x:ss)= s in x:(f ss t)」也不會導致堆棧溢出,所以它不能與RULES部分有關...... – martingw 2010-05-19 22:14:37