我不知道为什么为什么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