Я думал, что подобные выражения заставят 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-arg, которые имеют себя в правой части, или это частный случай чего-то более общего, что я не знаю?
[EDIT]:
Еще один вопрос: если это происходит из-за специальной обработки из компилятора, в чем причина этого, когда невозможно проверить все бесконечные циклы? "Знакомые" языки не заботятся о таких случаях, как while (true);
или int f() { return f();}
, правильно?
Большое спасибо.