我曾认为这样的表达式会导致Haskell永远执行下去。但在GHCi和编译后的程序中,它们的行为让我感到惊讶。
例如,在GHCi中,这些表达式会一直阻塞,直到我按下Control+C
,但不会占用CPU。看起来像是在睡眠。
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参数函数的特殊规则,还是我不知道的更一般的特殊情况?[编辑]:
另一个问题:如果这是编译器的特殊处理,那么为什么要这样做,当不可能检查所有无限循环时?“熟悉”的语言不关心像
while (true);
或 int f() { return f(); }
这样的情况,对吗?非常感谢。
let loop = loop in ...
结构,但是问题中的示例实际上并没有使用“其他控制流分析”进行检测,而是通过“黑洞”机制在运行时进行检测。 - nominolo