Мне интересно, почему
Prelude> head $ reverse $ [1..10000000] ++ [99]
99
не приводит к ошибке. ++ в прелюдии кажется прямым и нерегулярным:
(++) :: [a] -> [a] -> [a]
(++) [] ys = ys
(++) (x:xs) ys = x : xs ++ ys
EDIT: Первоначально я думал, что проблема связана с тем, как ++ определяется в прелюдии, особенно с правилами перезаписи, поэтому вопрос продолжался, как показано ниже. Дискуссия показала мне, что это не так. Теперь я думаю, что некоторый ленивый эффект оценки заставляет код работать без, но я не совсем понимаю, как это сделать.
Итак, просто с этим, он должен работать в переполнении стека, правильно? Поэтому я полагаю, что это, вероятно, имеет какое-то отношение к магии ghc, которая следует за определением ++:
{- # ПРАВИЛА "++" [~ 1] forall xs ys. xs ++ ys = augment (\ c n → foldr c n xs) ys # -}
* Это помогает избежать? Может ли кто-нибудь дать какой-то намек на то, что происходит в этом фрагменте кода? **