為什麼Monad可以用來封裝IO操作?

時間 2021-05-31 03:30:42

1樓:遊客賬戶0x0

monad就是「可組合的計算上下文」,那麼IO完全可以當成「world」的 state monad。

強烈建議看下phlip walder的「how to declare an imperative」,

簡單來說,IO monad不是imperative的,而是declarative的,

IO monad是「純」的,它*描述*了乙個IO動作,a >>= \x -> b

意思是:乙個IO操作,它被執行時,先執行a,用a的結果算出b,再執行b。

性質上和你寫個非純語言的ast是一樣的,

那麼,非純的部分在哪?

非純的只有main,main會執行IO操作,執行過程是非純的。

2樓:「已登出」

Haskell世界中把一次IO的『動作』看作乙個『值』,從而可以保證這個值是pure的。不要理解成IO的『結果』是乙個『值』。

3樓:

如果是Haskell中的Monad: Monad本身沒有特殊之處,特殊的是Haskell為Monad提供了do-notation. do-notation幫你做了CPS並給了你semicolon and return,而不是Monad.

至於其他語言中沒有語法支援的Monad,基本屬於吃飽了撐的,你懂吧。

4樓:ClevelandAlto

魔法並不在bind裡,而是在runtime。

bind只是將多個IO組合起來,並定義了它們求值的順序。IO永遠不可能在haskell自己中被求值(unsafePerformIO不算)。

這就是為什麼main一般是個IO a。runtime去求值main,就把真正的IO給做了。

咖啡渣可以用來做什麼?

Sumatra 我拿咖啡渣用來當花肥的,咖啡機提示清理渣盒的時候,把廢棄的咖啡渣倒進密封袋裡面,裝好後,密封起來。等待咖啡渣發酵出毛,到這個步驟還不行,這時是不能用的,咖啡渣第一有味道,第二很容易吸引各種蟲子。要等咖啡渣長出的毛自己消掉就可以使用了,最好的花肥,沒有之一。 等等阿文 雖然經常喝咖啡,...

魚頭可以用來做什麼菜?

幸運葉子 我最喜歡的一道菜就是剁椒魚頭 材料 魚頭1個 湖南特製剁椒適量 調料 鹽,味精,紅油,薑絲,薑片,蔥花,白蘿蔔片,熟油各適量。1 將魚頭洗淨,去鰓,去鱗,從魚唇正中一劈為二。2 將鹽 味精均勻塗拌在魚頭上,醃製5分鐘後,將剁椒塗抹在魚頭上。在盤底放2 3片生薑和白蘿蔔片,將魚頭放上面,再在...

為什麼陶瓷片可以用來作防彈衣?

隔壁泰山 作為業內沒聽說有用陶瓷片做防彈衣的,因為那麼一大片陶瓷太重了,而且都是硬的不方便活動。穿了這麼一身,你還不要做戰術動作,匍匐,攀爬了呀。但是我們公司很早就開始用陶瓷做防彈插板了,我記得是從2005年就開始的。防彈插板主要是針對步槍彈的,對應的是美國NIJ標準的NIJ III級和以上的NIJ...