Haskell - Monads 声明

Monad只不过是一种具有一些额外功能的应用函子。 它是一个 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 函数不会更改值,也不应该更改 Monad 中的任何内容。 可以表示为"return >=> mf = mf"。

  • 右恒定律return 函数不会更改值,也不应该更改 Monad 中的任何内容。 可以表示为"mf >=> return = mf"。

  • 关联性 − 根据这条定律,Functor 和 Monad 实例应该以相同的方式工作。 数学上可以表示为"( f >==>g) >=> h =f >= >(g >=h)"。

前两条定律重复了同一点,即 return 应该在 bind 运算符的两侧都具有身份行为。

我们在前面的示例中已经使用了很多 Monad,但没有意识到它们是 Monad。 考虑以下示例,我们使用 List Monad 生成特定列表。

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

此代码将产生以下输出 −

[2,6,10,14,18]