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

Cha*_*ham 4 haskell typeclass algebraic-data-types

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

class Dog a where
   dog :: a -> Bool
Run Code Online (Sandbox Code Playgroud)

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

data D = A | B | C
Run Code Online (Sandbox Code Playgroud)

是否有一种简单的方法让D实现Dog而不必再次为A,B和C重新定义每个实例?

谢谢

Dan*_*ner 8

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

data A = Foo
data B = Bar
data C = Baz
data D = A | B | C
Run Code Online (Sandbox Code Playgroud)

......再有就是类型之间没有连接A和构造A类型D.因此,我怀疑(但我不能完全确定!)这个问题你的意思要问有类型如下格式D,而不是:

data D = A A | B B | C C
Run Code Online (Sandbox Code Playgroud)

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