6

我有以下内容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

出现这种错误消息的原因是什么?

4

1 回答 1

9

GeneralizedNewtypeDeriving使用类的底层实例来实现newtype. 但是,在这种情况下,这没有任何意义,因为m它甚至不适合成为MonadTrans(回忆m :: * -> *, but MonadTranswant (* -> *) -> * -> *) 的实例。

于 2017-01-24T09:22:05.753 回答