我有以下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
出现此类错误消息的原因是什么?
答案 0 :(得分:9)
GeneralizedNewtypeDeriving
使用类的基础实例来实现newtype
的类。但是,在这种情况下没有任何意义,因为m
甚至不是MonadTrans
的一个实例(回想一下m :: * -> *
,但是MonadTrans
想要(* -> *) -> * -> *
)。