Ответ 1
Как уже отмечалось в нескольких комментариях, это Haskell RTS обнаруживает бесконечный цикл во время выполнения. Это не всегда может обнаружить такие циклы, но в простых случаях это возможно.
Например,
x = x + 1
будет компилироваться просто отлично, но вызывать исключение во время выполнения. (Кстати, это исключение - в частности, вы можете поймать его, если хотите. Но вы, вероятно, "не хотите".)
Итак, почему GHC даже разрешает эту компиляцию? Ну, потому что, если я заменил +
на, скажем, :
, тогда выражение теперь заканчивается просто отлично. (Он представляет собой 1-элементный круговой список.) Компилятор не может сказать во время компиляции, что есть и не является разумной рекурсией. RTS не всегда может указывать во время выполнения; но когда он может сказать что-то не так, это даст вам знать, бросив на вас исключение.