具有代数数据类型的Haskell类型类

时间:2011-07-14 02:25:39

标签: haskell typeclass algebraic-data-types

我有一些代数数据类型A,B和C各自实现类:

class Dog a where
   dog :: a -> Bool

如果我创建一个新的代数数据类型:

data D = A | B | C

有没有一种简单的方法可以让D实现Dog而无需再次为A,B和C重新定义每个实例?

由于

1 个答案:

答案 0 :(得分:8)

在回答之前,我应该指出,你可能会陷入普通初学者对ADT的误解。请记住,Haskell有两个单独的名称空间用于类型和术语级别。所以如果我们写:

data A = Foo
data B = Bar
data C = Baz
data D = A | B | C

...然后类型AA类型的构造函数D之间没有任何关联。因此,我怀疑(但我不完全确定!)您意味着提出的问题具有类型D的以下格式,而是:

data D = A A | B B | C C

在这种情况下,简短的回答是“不”。你可能希望你可以使用deriving Dog或类似的东西并完成,但该语言不提供该功能。也就是说,有一些通用编程的软件包可以提供帮助:只需检查Hackage软件包列表并搜索“deriv”,你就可以获得大约10次点击。