【发布时间】:2020-02-28 18:32:46
【问题描述】:
我正在尝试创建自己的数据类型,它将成为 Monad 类的一部分,但是
newtype Container a = Container a deriving Monad
给我这个错误:
* Can't make a derived instance of `Monad Container'
(even with cunning GeneralizedNewtypeDeriving):
cannot eta-reduce the representation type enough
* In the newtype declaration for `Container'
|
30 | newtype Container a = Container a deriving Monad
它适用于其他类(例如 Show),但不适用于 Monad,那么我如何说服 ghci 将我的 Container 实例化为 Monad 类?
谢谢
【问题讨论】:
-
问题是
a不是 monad 的实例,因此它没有多大意义。例如,如果您使用newtype Container a = Container [a] deriving (Functor, Applicative, Monad),它将起作用,因为[]是Monad的一个实例。 -
GenerlizedNewtypeDeriving专门用于将包装类型的实例“提升”到新类型。如何(或是否)可以自动为Container派生Monad实例的问题仍然很有趣。 (base为Identity显式定义了Monad实例这一事实表明您不能。) -
Monad不是 Haskell 标准可以自动派生的类型类之一(Show是,以及其他一些基本类型)。不过,我相信 GHC 可以通过正确的扩展来做到这一点。 -
@RobinZigmond 请注意,消息表明
GeneralizedNewtypeDeriving已启用,问题是为什么它仍然不起作用。
标签: haskell instance monads newtype deriving