如何在Haskell中继承Eq类?

时间:2013-04-19 17:08:45

标签: 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)

当我实现类似

的东西时
     (==)::a->a->Bool 
     x==y = not (x/=y) 

我收到错误我该如何解决?

2 个答案:

答案 0 :(得分:12)

为您的人类派生平等是最简单的:

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

这会根据==的{​​{1}}为Person a自动创建==个功能。

为什么

在haskell中,a==类的成员。您只能通过创建Eq类的实例来定义==,如果您尝试另外定义它,则会出现错误。

使它成为类的一部分使您可以轻松地定义适合您的数据类型的相等性。

手动定义实例

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

Eq

答案 1 :(得分:-2)

我找到了答案

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)