单子(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)式声明的三个基本原则是:
return >=> mf = mf
;mf >=> return = mf
;( 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]