【问题标题】:Cannot make a derived instance of monad transformer无法创建 monad 转换器的派生实例
【发布时间】:2017-01-24 08:50:02
【问题描述】:

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

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

【问题讨论】:

    标签: haskell monad-transformers deriving


    【解决方案1】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 2020-04-07
    • 2013-11-16
    • 2014-09-29
    • 2020-10-26
    相关资源
    最近更新 更多