在並行&並行Haskell書,在http://chimera.labs.oreilly.com/books/1230000000929/ch09.html#sec_timeout,爲什麼fmap Just m
不只是立即返回一個thunk(擊敗時間限制的目的)?fmap是否嚴格應用IO?
或IO
東西是特別的,fmap
總是強制結果?這會讓我感到驚訝,因爲monad-par
包使用NFData
並強制避免這種行爲AFAIK。
我肯定會錯過什麼。請賜教。
在並行&並行Haskell書,在http://chimera.labs.oreilly.com/books/1230000000929/ch09.html#sec_timeout,爲什麼fmap Just m
不只是立即返回一個thunk(擊敗時間限制的目的)?fmap是否嚴格應用IO?
或IO
東西是特別的,fmap
總是強制結果?這會讓我感到驚訝,因爲monad-par
包使用NFData
並強制避免這種行爲AFAIK。
我肯定會錯過什麼。請賜教。
在這個答案中,我使用「計算」一詞來描述有效的,與環境交互的部分執行IO操作。術語各不相同。
給定一個IO計算act :: IO a
計算fmap Just act
是一個計算(運行時)運行整個計算act
,然後適用於結果。
它並不立即返回thunk。爲此,它必須將計算act
推遲到thunk中,並且不能將計算放入thunk中,只能進行評估。 Thunk僅包含純粹的評估,這正是他們工作的原因 - 我們知道推遲評估是可以的,因爲我們知道評估執行時並不重要,答案仍然是一樣的。計算的執行並非如此,它可以與外部世界進行交互,並且在運行時可能會根據環境返回不同的答案。
的原語(可以說是「語破」原語)unsafePerformIO
和unsafeInterleaveIO
讓你打破規則前款埋葬的IO計算成一個thunk,這一點有時候是你真正想要的東西,往往是一個可怕的,可怕的理念。
我猜懶惰的IO負載在'不安全'然後呢? – ron
是的,它符合'不安全'的要求。大部分懶惰的IO東西都是用'unsafeInterleaveIO'實現的。 – drquicksilver
這是Oleg關於該主題的一個非常古老的咆哮:http://www.haskell.org/pipermail/haskell-cafe/2007-March/023073.html – drquicksilver