2014-02-28 72 views

回答

4

在這個答案中,我使用「計算」​​一詞來描述有效的,與環境交互的部分執行IO操作。術語各不相同。

給定一個IO計算act :: IO a計算fmap Just act是一個計算(運行時)運行整個計算act,然後適用於結果。

它並不立即返回thunk。爲此,它必須將計算act推遲到thunk中,並且不能將計算放入thunk中,只能進行評估。 Thunk僅包含純粹的評估,這正是他們工作的原因 - 我們知道推遲評估是可以的,因爲我們知道評估執行時並不重要,答案仍然是一樣的。計算的執行並非如此,它可以與外部世界進行交互,並且在運行時可能會根據環境返回不同的答案。

的原語(可以說是「語破」原語)unsafePerformIOunsafeInterleaveIO讓你打破規則前款埋葬的IO計算成一個thunk,這一點有時候是你真正想要的東西,往往是一個可怕的,可怕的理念。

+0

我猜懶惰的IO負載在'不安全'然後呢​​? – ron

+1

是的,它符合'不安全'的要求。大部分懶惰的IO東西都是用'unsafeInterleaveIO'實現的。 – drquicksilver

+0

這是Oleg關於該主題的一個非常古老的咆哮:http://www.haskell.org/pipermail/haskell-cafe/2007-March/023073.html – drquicksilver

相關問題