Определение MonadFree предоставляет определение по умолчанию wrap
:
wrap :: (m ~ t n, MonadTrans t, MonadFree f n, Functor f) => f (m a) -> m a
GHC пытается использовать это определение, но не может найти MonadTrans
экземпляр.
Вы можете определить MonadTrans
экземпляр для ApplicationStack
, или вы можете указать GHC основывать экземпляр MonadFree
для ApplicationStack
на MonadFree
экземпляре для StateT
,вместо.Если вы используете GHC 8.2 или новее, самый простой способ сделать это позже - использовать производные стратегии .Это выглядит примерно так:
deriving newtype instance MonadFree f p => MonadFree f (ApplicationStack s r p)
В старом GHC требуется некоторая обработка, чтобы активировать нужные расширения в нужных модулях.