我有一些代数数据类型A、B和C,每个类型都实现了以下类:
class Dog a where
dog :: a -> Bool
如果我创建一个新的代数数据类型:
data D = A | B | C
有没有一种简单的方法,可以在不需要重新为A、B和C的每个实例重新定义时,实现D对Dog的继承呢?
谢谢。
我有一些代数数据类型A、B和C,每个类型都实现了以下类:
class Dog a where
dog :: a -> Bool
data D = A | B | C
在回答之前,我应该指出你可能会陷入关于ADT的常见初学者误解中。请记住,Haskell在类型和术语层面上有两个不同的命名空间。因此,如果我们写成:
data A = Foo
data B = Bar
data C = Baz
data D = A | B | C
如果类型A
与类型D
的构造函数A
之间没有连接,那么我怀疑(但并不完全确定!)你想要问的问题应该是以下格式的类型D
:
data D = A A | B B | C C
deriving Dog
之类的东西就可以了,但语言并没有提供这个功能。尽管如此,有一些泛型编程的包可以帮助:只需检查Hackage包列表并搜索“deriv”,你将得到大约十个结果。