2
我知道作爲一個事實,我們不能獨立實現IO monad,但我不知道爲什麼。這段代碼試圖用函數式語言來實現一個命令式的範例。你能解釋一下這個例子和真正的IO之間的區別嗎?它看起來像函數main實現正確的操作順序,並保持懶惰。Haskell內部的IO實現
import System.IO.Unsafe
data Io a = Io a
runIO :: Io a -> a
runIO (Io a) = a
instance Monad Io where
return x = Io x
Io a >>= f = f a
-- internal side effect function
output :: Show a => a -> Io()
output s = return $! unsafePerformIO $ print s
----------------------------------------------------------------
mainIO :: Io()
mainIO = do output "A"
b <- return "B"
output b
output b
x <- return (undefined :: String)
return undefined
output "C"
head [output "C", output "C"]
output x
output "D"
test = runIO mainIO
輸出:
"A"
"B"
"B"
"C"
"C"
<interactive>: Prelude.undefined
感謝您的回覆和參考!我在這個網站上是新的,所以如果我稍後在這個主題中提出一些問題,有人會注意到它嗎?或者創建一個新的話題會更好嗎? – user1374768
順便說一下,我的問題出現在閱讀本教程http://www.haskell.org/haskellwiki/IO_inside和本文http://webcache.googleusercontent.com/search?q=cache:ry-JwgJnib0J:research之後。 microsoft.com/pubs/67066/imperative.ps.z+hl=ru(a,RealWorld) – user1374768
這裏使用了定義爲RealWorld - >(a,RealWorld)的IO類型,因此使用假參數來實現動作序列真實世界。但恕我直言,這種模式是不可能的純語言沒有外部編譯器黑客。所以我想知道爲什麼使用這個實現,希望pdf有更明確的解釋。 – user1374768