我认为像这样的表达式会导致Haskell永远评估。但GHCi和编译程序的行为让我感到惊讶。好奇在Haskell中如何评估“loop = loop”
例如,在GHCi中,这些表达式被阻止,直到I 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-arg函数,或者这是我不知道的更一般的特殊情况?
[编辑]:
一个问题:如果发生这种情况是由编译器进行特殊处理,后面是什么这样做时,它不可能检查所有无限循环的原因是什么? '熟悉'语言不关心像while (true);
或int f() { return f();}
这样的情况,对不对?
非常感谢。
谢谢bdonlan。我刚刚更新了一下我的问题。那么,试图检测无限循环的原因是什么?为什么运行时出现异常,而编译时没有警告? – Phil 2011-02-26 12:20:08
@Po,更新回答:) – bdonlan 2011-02-26 13:05:20
用错误代替这些东西的通常术语是“blackholing”。另请参阅[fixIO](http://www.haskell.org/ghc/docs/latest/html/libraries/base/src/System-IO.html#fixIO),它基本上做了同样的事情。 – barsoap 2011-02-26 14:31:14