无法创建 monad 转换器的派生实例

Cannot make a derived instance of monad transformer

我有以下 newtype:

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

newtype Wrap m a = Wrap {runWrap :: m a}
  deriving (Functor, Applicative, Monad, MonadTrans)

我正在尝试自动导出 MonadTrans,但出现以下错误:

• Can't make a derived instance of ‘MonadTrans Wrap’
    (even with cunning GeneralizedNewtypeDeriving):
    cannot eta-reduce the representation type enough
• In the newtype declaration for ‘Wrap’

但是,为 MonadTrans 编写简单的实例工作得很好:

instance MonadTrans Wrap where
  lift = Wrap

出现这样的错误信息是什么原因?

GeneralizedNewtypeDeriving 使用 class 的基础实例来实现 newtype 的 class。然而,在这种情况下,这没有任何意义,因为 m 甚至不是 MonadTrans 的实例(回想一下 m :: * -> *,但 MonadTrans 想要 (* -> *) -> * -> *).