Haskell - 单子



单子不过是一种具有额外功能的应用函子类型。它是一种类型类,支配着被称为单子规则的三个基本规则。

所有三个规则严格适用于一个如下所示的单子声明:

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 

适用于一个单子声明的三条基本定律如下:

  • 左同一律 - return 函数不改变值,它不应改变单子中的任何内容。它可以表示为“return >=> mf = mf”。

  • 右同一律 - return 函数不改变值,它不应改变单子中的任何内容。它可以表示为“mf >=> return = mf”。

  • 结合律 - 根据此定律,函子和单子实例都应以相同的方式工作。它可以用数学表达式“(f >==>g)>=> h =f >= >(g >=h)”表示。

前两条定律重复了同一观点,即在 bind 运算符的两侧,return 应具有恒等行为。

在以前面的示例中,我们已经使用了大量单子,而没有意识到它们是单子。考虑采用列表单子生成特定列表的以下示例。

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

此代码将产生以下输出:

[2,6,10,14,18]
广告