繁体   English   中英

Haskell - 你有一个不是应用函子的monad吗?

[英]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`

它们共同满足FunctorApplicative的签名和法律。 这就是为什么超类约束有意义添加,并且它是纯粹的历史事故,它在第一种情况下不存在 - 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

有关ApplicativeMonad如何相关的更多信息,请看一下我之前在这里写的答案: 根据Monad的应用来定义Functor是否更好,反之亦然?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM