我试图定义一个新的monad,我得到一个奇怪的错误
newmonad.hs
newtype Wrapped a = Wrap {unwrap :: a}
instance Monad Wrapped where
  (>>=) (Wrap x) f =  f x
  return x = Wrap x
main = do
  putStrLn "yay"
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.10.1
$ ghc newmonad.hs 
[1 of 1] Compiling Main             ( newmonad.hs, newmonad.o )
newmonad.hs:2:10:
    No instance for (Applicative Wrapped)
      arising from the superclasses of an instance declaration
    In the instance declaration for ‘Monad Wrapped’
为什么我需要定义一个实例Applicative?
Mat*_*hid 83
这是申请Monad提案(AMP).现在每当你声明某些内容时Monad,你也必须将其声明为Applicative(因此Functor).从数学角度讲,每个monad 都是一个应用函子,所以这是有道理的.
您可以执行以下操作以删除错误:
instance Functor Wrap where
  fmap f (Wrap x) = Wrap (f x)
instance Applicative Wrap where
  pure = Wrap
  Wrap f <*> Wrap x = Wrap (f x)
https://wiki.haskell.org/Functor-Applicative-Monad_Proposal
编辑:也许我应该更清楚地指出这是最近的事情?您发布的代码以前曾用过,但是对于最新版本的GHC,您将收到错误消息.这是一个突破性的变化.
编辑:以下声明应适用于任何 monad:
import Control.Applicative -- Otherwise you can't do the Applicative instance.
import Control.Monad (liftM, ap)
instance Functor ??? where
  fmap = liftM
instance Applicative ??? where
  pure  = return
  (<*>) = ap
根据所讨论的monad,可能会有更高效的实现,但这是一个简单的起点.