我有以下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使用类的基础实例来实现newtype的类。但是,在这种情况下这没有任何意义,因为m甚至不是MonadTrans实例的正确类型(记得m :: * -> *,但是MonadTrans需要(* -> *) -> * -> *)。

关于haskell - 无法生成monad转换器的派生实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41823706/

10-09 15:52