Haskell代数数据类型中的类型类

4

我有一些代数数据类型A、B和C,每个类型都实现了以下类:

class Dog a where
   dog :: a -> Bool

如果我创建一个新的代数数据类型:
data D = A | B | C

有没有一种简单的方法,可以在不需要重新为A、B和C的每个实例重新定义时,实现D对Dog的继承呢?
谢谢。

1
你的意思是创建一个新的数据类型来使用原始数据类型吗?还是将现有的数据类型组合成一个替代它们的单一类型?虽然无论哪种情况,答案可能都是“不太可能”。 :T - C. A. McCann
狗(dog)与D有什么关系?你究竟想做什么?狗(dog):: D -> Bool 狗(dog)A = True 狗(dog)B = False类似这样的吗? - eternalmatt
1个回答

8

在回答之前,我应该指出你可能会陷入关于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”,你将得到大约十个结果。

感谢您的回答,以及正确的假设。这正是我想知道的。 - Charles Durham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接