這麼理解Haskell的Monad對不對?

時間 2021-05-31 11:30:32

1樓:Belleve

就像量子力學一樣,不要嘗試用日常生活中能見到的東西,去模擬乙個這麼抽象的數學結構

如果用原版的 unit/join 定義 monad 那你現在看 monad 應該是——可以「增加一層」和「合併兩層」的某種封裝(「箱子」),而 Haskell 的 >>= 含義變成了:

開啟箱子

把裡面的東西裝進一層箱子(fmap)

把兩層箱子合併(join)成一層

原版是這樣的:

2樓:阿萊克西斯

這句話不完全對; 「所以可以實現將多個具有a -> m b型別的函式串起來的功能,這就使得這一系列的計算出現了相互依賴關係,從而迫使haskell放棄lazy的行為,」

一般來說是這樣的,但是也很容易找出或實現出反例;

因為如果a-> m b 這個函式沒有用到a,a根本就不會被evaluate;或者a-> m b 這個函式f在monad的實現裡, 可以被跳過,可以不用,甚至實現可以根本不用a和f來給出乙個m b,這些情況都不會對a evaluate和b evaluate加入依賴;所以所謂依賴關係,還是要看monad是怎麼實現的,和a->m b是什麼

如何理解Haskell中的函式呼叫

並不是你想的語法糖,按照你的思路,只返回的函式咋辦?事實是這是一種叫柯里化的東西,用必應會谷歌自行查詢 Currying Function 事實上,對於Haskell 很多地方與一般的面相過程與物件的語言是不一樣的。 UWRF 對於 a b 是函式嗎?a 和 b 是什麼不重要,但 a 和 b 的型別...

如何理解這兩個函式的區別(Haskell)?

其實沒區別,區別是編譯器造成的,有個叫CAF 的東西,必應谷歌或者Haskell Wiki 中搜尋 Haskell CAF,第二個中的 x 破壞了這個,編譯器,在 O0 下會自動優化 當然,在不要這個 優化的方式就是備忘錄法,memorization,對於第乙個,當你計算第n個數的時候,時間複雜度是...

Haskell 的 Graph reduction 在現實機器中是怎樣實現的?

neo lin 那就來看我渣優秀員工十年前 2007 的formal proof 吧。我也是才知道的 MaskRay Implementing Functional Languages a tutorial 實現過兩章 template instantiation和Three Instruction...