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 声明的三个基本法则是 -
Left Identity Law -返回函数不会改变值,也不应该改变 Monad 中的任何内容。可以表示为“return >=> mf = mf”。
正确的同一性法则-返回函数不会改变值,也不应该改变 Monad 中的任何内容。可以表示为“mf >=> return = mf”。
关联性- 根据该定律,Functor 和 Monad 实例应该以相同的方式工作。它可以在数学上表达为“( f >==>g) >=> h =f >= >(g >=h)”。
前两条定律重复了同一点,即返回值在绑定运算符的两侧都应该具有相同的Behave。
我们在前面的示例中已经使用了很多 Monad,但没有意识到它们是 Monad。考虑以下示例,我们使用 List Monad 生成特定列表。
main = do print([1..10] >>= (\x -> if odd x then [x*2] else []))
该代码将产生以下输出 -
[2,6,10,14,18]