Я не думал, что подобные выражения заставят Haskell вычисляться вечно. Но поведение как в GHCi, так и в скомпилированной программе меня удивило.
Например, в GHCi эти выражения блокировались до тех пор, пока я Control + C
не занимал процессор. Похоже, он спал.
let loop = loop
let loop = 1 + loop
Я попытался скомпилировать эти программы с помощью GHC:
main = print loop
where loop = 1 + loop
main = print loop
where loop = if True then loop else 1
Было напечатано:
Main: <<loop>>
Итак, мой вопрос: Очевидно, что эти выражения компилируются в нечто иное, чем циклы или рекурсивные вызовы в императивных языках. Для чего они скомпилированы? Это особое правило для обработки функций с 0 аргументами, которые находятся в правой части, или это частный случай чего-то более общего, чего я не знаю?
[EDIT]:
Еще один вопрос: если это особая обработка со стороны компилятора, в чем причина этого, когда невозможно проверить все бесконечные циклы? «Знакомые» языки не заботятся о таких случаях, как while (true);
или int f () {return f ();}
, верно?
Большое спасибо.