[英]Haskell - can you have a monad that is not an applicative functor?
在吉姆·杜伊(Jim Duey)在幻灯片13中的这组幻灯片中 - 他建议所有Monad都是适用的编织者。
在Haskell 7.7编译器输出中 - 我看到以下(另一个例子在这里 ):
'Parser'是Monad的一个实例,但不是Applicative - 根据Applicative-Monad提案,这将成为GHC 7.10中的错误。
这是否意味着Haskell编译器目前容忍Monad不是应用程序的编写器 - 但计划是纠正这个?
现在Applicative
不是Monad
的超类
instance Monad m where ... -- this is how it is today, instead of
instance Applicative m => Monad m where ...
但是计划在GHC 7.10中进行更改,以便Applicative
是 Monad
的超类。 为了帮助过渡,在GHC 7.7和7.8中,只要GHC在没有Applicative
实例的情况下遇到Monad
就会发出警告。
现在稍微令人困惑的是, 所有有效的Monad
都是适用的函子,即使它们不是Applicative
instance
。 我们可以写
fmapM :: Monad m => (a -> b) -> m a -> m b
fmapM f ma = ma >>= return . f -- a.k.a. `liftM`
pureM :: Monad m => a -> m a
pureM = return
ap :: Monad m => m (a -> b) -> m a -> m b
ap mf ma = do { f <- mf; a <- ma; return (f a) } -- a.k.a. `ap`
它们共同满足Functor
和Applicative
的签名和法律。 这就是为什么超类约束有意义添加,并且它是纯粹的历史事故,它在第一种情况下不存在 - Applicative
s在Monad
s之后被发现和推广。
newtype WrappedMonad m a = WM (m a)
instance Monad m => Functor (WrappedMonad m) where
fmap f (WM m) = WM (liftM f m)
instance Monad m => Applicative (WrappedMonad m) where
pure = WM . return
WM mf <*> WM ma = WM $ mf `ap` ma
有关Applicative
和Monad
如何相关的更多信息,请看一下我之前在这里写的答案: 根据Monad的应用来定义Functor是否更好,反之亦然?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.