我認爲像這樣的表達式會導致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