Monad 遵循 3 個 Monad Laws,專門描述 >>=
的 3 個特性。
Version
Haskell for Mac 1.8.2
Left Identity
f = Just . (+1)
Just 1 >>= f
f 1
當存在回傳 Monad 的 function 時:
- 使用
>>=
將 Monad 與回傳 Monad 的 function 綁定 - 直接將 value 傳入回傳 Monad 的 function
兩者結果相同。
也就是 >>=
能將 Moand 與回傳 Monad 的 function 綁定,然後改變 Monad 內部 value。
Left Identity
return a >>= f === f a
return a >>= f
:使用>>=
將 Monad 與 function 綁定f a
:value 直接傳入 function===
:兩者結果相同
Right Identity
Just 1 >>= Just
Just 1
當存在 return
時:
- 使用
>>=
將 Monad 與return
綁定 - 將 value 直接包進 Monad
兩者結果相同。
也就是使用 >>=
將 Monad 與 return
綁定時不會改變 Monad。
Right Identity
m >>= return === m
m >>= return
:使用>>=
將 Monad 與return
綁定m
:Monad===
:兩者結果相同
Associativity
f = Just . (+1)
g = Just . (*2)
Just 1 >>= f >>= g
f 1 >>= g >>= Just
- 將 value 先包進 Monad,再連續透過
>>=
使用f
與g
運算 - 將 value 先經過
f
運算,再透過>>=
使用g
運算,最後再包進 Monad
兩者結果相同。
也就是先將 value 包進 Monad 再連續使用 >>=
將 function 綁定,與 value 先經過 function 運算最後包進 Monad 結果相同。
Associativity
(m >>= f) >>= g === m >>= (\x -> f x >>= g)
(m >>= f) >>= g
:使用>>=
將 Monad 先與f
綁定,結果再使用>>=
與g
綁定m >>= (\x -> f x >>= g)
:value 先經過f
運算,再使用>>=
將 Monad 與g
綁定,最後再使用>>=
將 Monad 與return
綁定===
:兩者結果相同
Conclusion
- 可發現
>>=
應用在 Monad 時特別清楚 return
在 Haskell 用來將 value 建立 Monad;在 Fandasy Land 則稱為of
,為 Applicative 必備 function,如of (Maybe)
或Just
>>=
在 Haskell 稱為bind
,在 Fantasy Land 稱為chain
,為 Chain 必備 function