Получение MonadFree от нового типа с помощью стека трансформаторов - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь получить MonadFree из newtype, и я просто не могу понять это.Мой текущий код:

newtype ApplicationStack s r p m =
  ApplicationStack { runApplication :: StateT s (ReaderT r p) m }
  deriving (Functor, Applicative, Monad, MonadState s, MonadReader r)

deriving instance MonadFree f p => MonadFree f (ApplicationStack s r p)

, и я получаю

• Could not deduce (transformers-0.5.5.0:Control.Monad.Trans.Class.MonadTrans
                      (ApplicationStack s r))
    arising from a use of ‘Control.Monad.Free.Class.$dmwrap’
  from the context: MonadFree f p
    bound by the instance declaration
    at src/Application/Commands/Base.hs:41:10-62
• In the expression:
    Control.Monad.Free.Class.$dmwrap @(f) @(ApplicationStack s r p)
  In an equation for ‘Control.Monad.Free.Class.wrap’:
      Control.Monad.Free.Class.wrap
        = Control.Monad.Free.Class.$dmwrap @(f) @(ApplicationStack s r p)
  In the instance declaration for
    ‘MonadFree f (ApplicationStack s r p)’
   |
41 | instance MonadFree f p => MonadFree f (ApplicationStack s r p)
   |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Если у кого-то есть какие-либо предложения, которые будут по достоинству оценены.

1 Ответ

0 голосов
/ 07 октября 2018

Определение 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 требуется некоторая обработка, чтобы активировать нужные расширения в нужных модулях.

...