Ответ 1
Это аппликативное предложение Монады (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
В зависимости от рассматриваемой монады возможны более эффективные реализации, но это простая отправная точка.