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

标签 haskell monad-transformers deriving

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

相关文章:

haskell - 我是否可以禁止一个特定的数据构造函数位于另一个数据构造函数中,而两者都给出相同的类型?

oracle - 如何在 Haskell 中连接到 Oracle DB

Haskell:类和函数重载:

f# - 如何在 F# 中组合状态和延续单子(monad)

haskell - 为什么我们不能在 Haskell 中为枚举派生 Random 类实例?

haskell - 从具有函数作为 Haskell 中的字段的数据类型派生 Eq 时出现问题

haskell - 我将如何以无点风格重写这个回文验证器?

haskell - 如何创建 MonadRandom (StateT PureMT m0)? ( haskell )

haskell - Haskell 中的推导是如何进行的?

haskell - 在这种情况下,为什么在与嵌套的 StateT monadT 交互时不需要使用 'lift'?