Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.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中继承Eq类?_Haskell - Fatal编程技术网

如何在Haskell中继承Eq类?

如何在Haskell中继承Eq类?,haskell,Haskell,我想定义继承Eq类的新类PersonOP。 我的意思是我有一个数据类型 data Person a = {name:a,age:Int} 我想创建一个类似 class (Eq a)=> PersonOp a where 然后像这样举个例子 instance PersonOp (Person a) where (Person a)==(Person a) = equality (Person a) (Person a) 当我在课堂上实现类似的东西时

我想定义继承Eq类的新类PersonOP。 我的意思是我有一个数据类型

data Person a = {name:a,age:Int}
我想创建一个类似

   class (Eq a)=> PersonOp a where
然后像这样举个例子

   instance PersonOp (Person a) where

         (Person a)==(Person a) = equality (Person a) (Person a)
当我在课堂上实现类似的东西时

     (==)::a->a->Bool 
     x==y = not (x/=y) 

我遇到了一个错误,如何修复它?

为person类推导等式是最简单的:

data Person a = Person {name::a, age::Int}
   deriving Eq
这样你就可以

*Main> Person "James" 53 == Person "Fred" 23
False
*Main> Person "James" 53 == Person "James" 53
True
这会根据
a
=
自动为
人员a
创建一个
=
函数

为什么? 在haskell中,
==
Eq
类的成员。您只能通过创建
Eq
类的实例来定义
==
,如果您尝试以其他方式定义它,您将得到一个错误

使其成为类的一部分,可以方便地为数据类型定义适当的相等性

手工定义实例 您可以自己定义它,而不是派生
Eq
,例如:

data Person a = Person {name::a, age::Int}

instance Eq a => Eq (Person a) where
   someone == another = name someone == name another
                      && age someone == age another
我找到了答案

import Prelude hiding ((==))

data Person a = {name:a,age:Int}
class PersonOp a where
    (==)::a->a->Bool

instance PersonOp (Person a) where
    (Person a)==(Person a) = equality (Person a) (Person a)

为什么不在实例定义中简单地
a==a
?您想要一个类做什么?你只是想比较一下人的平等性吗?你不需要一个类,只需将
派生(Eq)
添加到你的
数据定义中。我想你的意思是“手工定义实例”?@Cubic。谢谢更正。我发现answer import Prelude hiding((==)@user2266517,但这会阻止您在程序中的任何其他位置使用
=
-如果您这样做,您不能在整数或字符串上使用
=
。答案中没有关于“如何继承Eq”的内容。