Sunday, November 22, 2020

研究 Monad 的心得

學了 Clojure 再來學 monad ,彷彿像是學了英文之後,再來學日文。表達同樣的語意,但是,用不同的方式表達。

一 monad 用來幹嘛?

monad 用來夾帶 context 。什麼是 context ?基本的概念有點像是,本來是「值」語意,加上了 context 就變成了「向量」語意。


二 如何定義 monad

定義一個 monad 就是要定義兩個 operations
(1) unit 或是稱之為 return 。
     這個 op 接受一個 value ,傳回被 monad 修飾過的 value (monadic value)

(2) combine 或是稱之為 bind。
     這個 op 接受一個 monadic value 和一個可以接受 ordinary value 的函數。這個 op 的作用就是組合上述兩者,於是就可以得到一個可以處理 monadic value 的新函數。

三 常見的 monad 所處理的問題集合

(1) Maybe monad 
     在 Clojure 的世界裡,比較好的 modeling 沒有值的方式,並不是使用 nil 。 而是使用 vector 或是 hashmap 來 modeling 真實世界的 entity 。如果用 vector 或是 hashmap 來做 modeling 的話,有時候根本不用判定 nil ,也就是 Maybe monad 完全不需要。

(2) List monad
     處理 mapcat 可以處理的問題。

(3) Reader monad
      處理 dependency injection 可以處理的問題。