3

我想定义继承 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) 

我有错误我该如何解决?

4

2 回答 2

12

为您的 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

这会自动创建一个基于for的==函数。Person 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
于 2013-04-19T17:17:20.757 回答
-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)
于 2013-04-20T11:08:32.473 回答