我想知道为什么
Prelude> head $ reverse $ [1..10000000] ++ [99]
99不会导致堆栈溢出错误。前奏中的++看起来是直接的、非尾部递归的:
(++) :: [a] -> [a] -> [a]
(++) [] ys = ys
(++) (x:xs) ys = x : xs ++ ys编辑:最初,我认为这个问题与前奏中定义++的方式有关,特别是与重写规则有关,因此问题继续如下。讨论告诉我,事实并非如此。我认为现在一些懒惰的计算效果导致代码在没有堆栈溢出的情况下运行,但我不太清楚是如何实现的。
因此,就这样,它应该会遇到堆栈溢出,对吧?所以我认为这可能与遵循++定义的ghc魔力有关:
{对于所有的X,-#规则"++“~1。xs ++ ys =扩充(\c n -> foldr c n xs) ys #-}
*这是避免堆栈溢出的方法吗?有人能为这段代码中发生的事情提供一些提示吗?**
https://stackoverflow.com/questions/2869750
复制相似问题