簡體   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