Это заявленное предложение монады (AMP). Теперь, когда вы объявляете что-то как Monad
, вы также должны объявлять его как Applicative
(и, следовательно, Functor
). Математически каждая монада является аппликативным функтором, поэтому это имеет смысл.
Вы можете сделать следующее, чтобы удалить ошибку:
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 вы получите сообщение об ошибке.
Изменить: Следующие объявления должны работать для любой монады:
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
В зависимости от рассматриваемой монады может быть возможны более эффективные реализации, но это простая отправная точка.