Monad 的定义

class Monad m where
    return::a -> m a
    (>>=) :: m a -> (a -> m b) -> m b

处理 monad 最重要的功能是绑定运算符 >>=

(>>=) :: m a -> (a -> m b) -> m b
  • m a 视为 “具有 a 结果的动作”
  • a -> m b 视为 “具有 b 结果的动作(取决于 a 参数)”

>>= 通过将第一个动作的结果传递给第二个动作来将两个动作排在一起。

Monad 定义的另一个函数是:

return::a -> m a

它的名字很不幸:这个 return 与命令式编程语言中的 return 关键字无关。

return x 是一个微不足道的行动,产生了 x 作为结果。 (在以下意义上这是微不足道的 :)

return x >>= f       ≡  f x     --  `left identity` monad law
       x >>= return  ≡  x       -- `right identity` monad law