Haskell Monads 怎么用?Monad 到底是什么原理?

文章导读
Previous Quiz Next Monads 只不过是一种带有额外功能的 Applicative Functor 类型。它是一个 type class,它规定了三个基本规则,称为 monadic rules(单子规则)。
A A

Haskell - Monads



Previous
Quiz
Next

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(结合律) − 根据此法则,FunctorMonad 实例应该以相同方式工作。它可以数学上表达为 "( f >==>g) >=> h =f >= >(g >=h)"。

前两个法则强调了同一个点,即 returnbind 操作符的两侧都应该具有单位行为。

我们在之前的示例中已经使用了大量的 Monads,而没有意识到它们是 Monad。考虑以下示例,我们使用 List Monad 来生成一个特定列表。

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

此代码将产生以下输出 −

[2,6,10,14,18]