![](/img/trans.png)
[英]How can I show that `Monad` is actually `Applicative` and `Functor`?
[英]How to show that a monad is a functor and an applicative functor?
Monad在理论上被认为是仿函数的一个子集,特别是应用仿函数,尽管它没有在Haskell的类型系统中指出。
知道这一点,给定一个monad并基于return
和bind
,如何:
fmap
, <*>
? 好吧, fmap
只是(a -> b) -> fa -> fb
,即我们想用纯函数转换monadic动作的结果。 用符号写起来很容易:
fmap f m = do
a <- m
return (f a)
或者,写成“原始”:
fmap f m = m >>= \a -> return (f a)
这可以作为Control.Monad.liftM
。
pure :: a -> fa
当然是return
。 (<*>) :: f (a -> b) -> fa -> fb
有点棘手。 我们有一个返回一个函数的动作,一个返回其参数的动作,我们想要一个动作返回它的结果。 再做一次记录:
mf <*> mx = do
f <- mf
x <- mx
return (f x)
或者,desugared:
mf <*> mx =
mf >>= \f ->
mx >>= \x ->
return (f x)
田田! 这可以作为Control.Monad.ap
,因此我们可以为任何monad M
提供Functor
和Applicative
的完整实例,如下所示:
instance Functor M where
fmap = liftM
instance Applicative M where
pure = return
(<*>) = ap
理想情况下,我们可以直接在Monad
指定这些实现,以减轻为每个monad定义单独实例的负担,例如使用此提议 。 如果发生这种情况,那么使Applicative
成为Monad
的超类将没有真正的障碍,因为它将确保它不会破坏任何现有代码。 另一方面,这意味着为给定Monad
定义Functor
和Applicative
实例所涉及的样板文件很少,因此很容易成为“好公民”(并且应该为任何monad定义此类实例)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.