點燈坊

失くすものさえない今が強くなるチャンスよ

深入淺出 Monad Laws

Sam Xiao's Avatar 2021-07-17

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
  • ===:兩者結果相同

laws000

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
  • ===:兩者結果相同

laws001

Associativity

f = Just . (+1)
g = Just . (*2)

Just 1 >>= f >>= g
f 1 >>= g >>= Just
  • 將 value 先包進 Monad,再連續透過 >>= 使用 fg 運算
  • 將 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 綁定
  • ===:兩者結果相同

laws002

Conclusion

  • 可發現 >>= 應用在 Monad 時特別清楚
  • return 在 Haskell 用來將 value 建立 Monad;在 Fandasy Land 則稱為 of,為 Applicative 必備 function,如 of (Maybe)Just
  • >>= 在 Haskell 稱為 bind,在 Fantasy Land 稱為 chain,為 Chain 必備 function