By George Z. August 13, 2021
Monads
Monad 只不过是一种具有一些额外功能的 Applicative Functor。它是一个 Type 类,它管理着三个基本规则,称为 monadic 规则。所有三个规则都严格适用于 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”。
- Right Identity Law - 返回函数不会改变值,也不应该改变 Monad 中的任何内容。可以表示为“mf >=> return = mf”。
- Associativity - 根据这个定律,Functors 和 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]