Haskell - Monads
Monads 只不过是一种带有额外功能的 Applicative Functor 类型。它是一个 type class,它规定了三个基本规则,称为 monadic rules(单子规则)。
所有三个规则都严格适用于 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 声明的三个基本法则如下 −
Left Identity Law(左单位律) − return 函数不会改变值,并且在 Monad 中不应该改变任何东西。它可以表达为 "return >=> mf = mf"。
Right Identity Law(右单位律) − return 函数不会改变值,并且在 Monad 中不应该改变任何东西。它可以表达为 "mf >=> return = mf"。
Associativity(结合律) − 根据此法则,Functor 和 Monad 实例应该以相同方式工作。它可以数学上表达为 "( f >==>g) >=> h =f >= >(g >=h)"。
前两个法则强调了同一个点,即 return 在 bind 操作符的两侧都应该具有单位行为。
我们在之前的示例中已经使用了大量的 Monads,而没有意识到它们是 Monad。考虑以下示例,我们使用 List Monad 来生成一个特定列表。
main = do print([1..10] >>= (\x -> if odd x then [x*2] else []))
此代码将产生以下输出 −
[2,6,10,14,18]