我有一些代数数据类型A,B和C各自实现类:
class Dog a where
dog :: a -> Bool
如果我创建一个新的代数数据类型:
data D = A | B | C
有没有一种简单的方法可以让D实现Dog而无需再次为A,B和C重新定义每个实例?
由于
答案 0 :(得分:8)
在回答之前,我应该指出,你可能会陷入普通初学者对ADT的误解。请记住,Haskell有两个单独的名称空间用于类型和术语级别。所以如果我们写:
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次点击。