我有一些代数数据类型 A、B 和 C,每个都实现了这个类:
class Dog a where
dog :: a -> Bool
如果我创建一个新的代数数据类型:
data D = A | B | C
有没有一种简单的方法让 D 实现 Dog 而不必再次为 A、B 和 C 重新定义每个实例?
谢谢
最佳答案
在回答之前,我应该指出您可能会陷入一个常见的初学者对 ADT 的误解。请记住,Haskell 有两个独立的 namespace 用于类型和术语级别。所以如果我们写:
data A = Foo
data B = Bar
data C = Baz
data D = A | B | C
...那么类型之间没有联系
A
和构造函数 A
类型 D
.因此,我怀疑(但不完全确定!)您要问的问题对于类型 D
具有以下格式, 反而:data D = A A | B B | C C
在这种情况下,简短的回答是“不”。您可能希望加入
deriving Dog
或者一些这样的事情并被完成,但语言不提供这种便利。也就是说,有一些通用编程包可以提供帮助:只需检查 Hackage 包列表并搜索“deriv”,您将获得大约 10 次点击。
关于具有代数数据类型的 Haskell 类型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6687810/