如何在Haskell中继承Eq类?
我想定义继承Eq类的新类PersonOP。 我的意思是我有一个数据类型如何在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) 当我在课堂上实现类似的东西时
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”的内容。