單子(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