любопытно, как «loop = loop» вычисляется в Haskell

Я не думал, что подобные выражения заставят 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 ();} , верно?

Большое спасибо.

15
задан Phil 26 February 2011 в 14:25
поделиться