如何在Haskell中继承Eq类?

Ali*_*eyn 3 haskell

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

data Person a = {name:a,age:Int}
Run Code Online (Sandbox Code Playgroud)

我想创建一个类

   class (Eq a)=> PersonOp a where
Run Code Online (Sandbox Code Playgroud)

然后像这样制作实例

   instance PersonOp (Person a) where

         (Person a)==(Person a) = equality (Person a) (Person a)
Run Code Online (Sandbox Code Playgroud)

当我在课堂上实现类似的东西

     (==)::a->a->Bool 
     x==y = not (x/=y) 
Run Code Online (Sandbox Code Playgroud)

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

And*_*ewC 12

为您的person类派生相等是最简单的:

data Person a = Person {name::a, age::Int}
   deriving Eq
Run Code Online (Sandbox Code Playgroud)

这样你就可以做到

*Main> Person "James" 53 == Person "Fred" 23
False
*Main> Person "James" 53 == Person "James" 53
True
Run Code Online (Sandbox Code Playgroud)

这会自动创建一个基于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
Run Code Online (Sandbox Code Playgroud)