なぜだろうか
Prelude> head $ reverse $ [1..10000000] ++ [99]
99
スタックオーバーフローエラーは発生しません。プレリュードの++は単純で、末尾再帰ではないようです。
(++) :: [a] -> [a] -> [a]
(++) [] ys = ys
(++) (x:xs) ys = x : xs ++ ys
編集:当初、この問題は前奏曲で++が定義されている方法、特に書き換えルールに関係していると思いました。したがって、質問は以下のように続きました。議論は私にこれが事実ではないことを示しました。遅延評価効果によってコードがスタックオーバーフローなしで実行されるようになったと思いますが、その方法はよくわかりません。
これだけで、スタックオーバーフローが発生するはずですよね?だから私はそれがおそらく++の定義に従うghc魔法と関係があると思います:
{-#ルール "++" [〜1] forallxsys。xs ++ ys = augment(\ cn-> foldr cn xs)ys#-}
*それはスタックオーバーフローを回避するのに役立ちますか?誰かがこのコードで何が起こっているのかについてのヒントを提供できますか?**