Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有代数数据类型的Haskell类型类_Haskell_Typeclass_Algebraic Data Types - Fatal编程技术网

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

具有代数数据类型的Haskell类型类,haskell,typeclass,algebraic-data-types,Haskell,Typeclass,Algebraic Data Types,我有一些代数数据类型A、B和C,每个类型都实现了类: class Dog a where dog :: a -> Bool 如果创建新的代数数据类型: data D = A | B | C 有没有一种简单的方法可以在不重新定义A、B和C的每个实例的情况下定义implementdog 谢谢在回答之前,我要指出的是,你可能陷入了一种常见的初学者对ADT的误解。记住,Haskell有两个单独的名称空间用于类型和术语级别。因此,如果我们写: data A = Foo data B = B

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

class Dog a where
   dog :: a -> Bool
如果创建新的代数数据类型:

data D = A | B | C
有没有一种简单的方法可以在不重新定义A、B和C的每个实例的情况下定义implementdog


谢谢

在回答之前,我要指出的是,你可能陷入了一种常见的初学者对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

在这种情况下,简短的回答是“不”。你可能希望你可以加上一个
衍生狗或类似的东西,然后就可以完成了,但是这种语言并没有提供这种功能。也就是说,有一些通用编程包可能会有所帮助:只需查看Hackage packages列表并搜索“deriv”,您将获得大约十个点击率。

您的意思是创建一个使用原始数据的新数据类型吗?或者将现有类型合并为一个替换它们的类型?尽管如此,在这两种情况下,答案都可能是“不,不是真的”狗和D有什么关系?你到底想干什么?狗:D->Bool dog A=真狗B=假类似的东西?谢谢你的回答和正确的假设。这正是我想知道的。