Haskell Monads
精华
小牛编辑
112浏览
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]