我認爲,原則上haskell的類型系統將禁止從純粹的函數中調用不純的函數(即f :: a -> IO b
),但今天我意識到通過return
來調用它們,它們編譯得很好。在例如:現在純函數中IO操作的含義是什麼?
h :: Maybe()
h = do
return $ putStrLn "???"
return()
,h
作品中,也許單子,但它是一個純函數不過。編譯並運行它只需返回Just()
,而不需要實際執行任何I/O操作。我認爲哈斯克爾的懶惰把東西放在一起(即putStrLn
的返回值沒有被使用 - 因爲它的值構造函數是隱藏的,我無法對它進行模式匹配),但爲什麼這個代碼是合法的呢?是否有任何其他原因使得這個允許?
作爲一個獎勵,相關問題:一般來說,是否有可能從其他內部禁止monad的所有操作?怎麼樣?
如何讓monad從另一個執行動作的能力,通過賦予它與包含的值進行模式匹配的可能性? – 2012-03-22 09:46:17
通過編寫將一個monad轉換爲另一個monad的方法,或者執行一些操作。例如,Control.Monad.ST.stToIO'將'ST'計算轉換爲'IO'計算。 – 2012-03-22 10:08:02
晶瑩剔透。謝謝你們倆! – 2012-03-22 10:33:23