0

我试图MonadFree从 a中得出,但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)
   |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

如果有人有任何建议,将不胜感激。

4

1 回答 1

1

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 中,要在正确的模块中激活正确的扩展需要一些麻烦。

于 2018-10-07T14:53:05.410 回答