当前位置: 首页 > 教程 > Haskell >

Haskell Monads

精华
小牛编辑
107浏览
2023-03-14

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

  • 左标识定律 - 返回函数不会更改值,并且不应更改Monad中的任何内容。可以表示为:return >=> mf = mf
  • 右标识定律 - 返回函数不会改变值,也不会改变Monad中的任何内容。它可以表示为:mf >=> return = mf
  • 关联性 - 函子和单子(Monad)实例的工作方式是相同的。它可以用数学形式表示:( 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]