Haskell Monads

單子(Monad)只是一種帶有某些附加功能的Applicative Functor。它是一個Type類,它管理三個基本規則(稱為一元規則)。

這三個規則嚴格適用於Monad聲明,如下所示:

class Monad m where
   return :: a -> m a
   (>>=) :: m a -> (a -> m b) -> m b
   (>>) :: m a -> m b -> m b
   x >> y = x >>= \_ -> y
   fail :: String -> m a
   fail msg = error msg

單子(Monad)式聲明的三個基本原則是:

  • 左標識定律 - 返回函數不會更改值,並且不應更改Monad中的任何內容。可以表示為:return >=> mf = mf
  • 右標識定律 - 返回函數不會改變值,也不會改變Monad中的任何內容。它可以表示為:mf >=> return = mf
  • 關聯性 - 函子和單子(Monad)實例的工作方式是相同的。它可以用數學形式表示:( f >==>g) >=> h =f >= >(g >=h)

前兩個定律迭代同一點,即返回應在綁定運算符的兩側都具有標識行為。

在前面的示例中,我們已經使用了許多Monad,但是沒有意識到它們是Monad。參考下麵的示例,其中使用List Monad生成特定列表。

main = do
   print([1..10] >>= (\x -> if odd x then [x*2] else []))

執行上面示例代碼,得到以下結果:

[2,6,10,14,18]

上一篇: Haskell函子(functor) 下一篇: Haskell Zippers