Haskell 作业中类型构造函数的问题

Dud*_*662 3 haskell typeclass

我创建了一个数据类型,需要使用 instance 使其成为相等类型类的实例。我的数据类型由值 R a b 组成。我想使R x y等于R c dif xis equal tocyis equal to d

这是我到目前为止编写的代码。它不编译。

 data Row a b = R a b deriving (Show)
 instance Eq (Row a b)  where
     (R x y) == (R c d) = (x == c) && (y == d)
     _ == _ = False
Run Code Online (Sandbox Code Playgroud)

我认为这可能是错误的,因为类型 a 和 b 不一定必须在 Equality 类型类中。我不知道如何解决这个问题。

Wil*_*sem 5

您只能检查两个R a b,S是平等的给你可以检查的项目ab相等。因此,您需要将这些添加为类型约束:

instance (Eq a, Eq b) => Eq (Row a b)  where
    (R x y) == (R c d) = (x == c) && (y == d)
    _ == _ = False
Run Code Online (Sandbox Code Playgroud)

但是请注意,你不会需要实现Eq自己的实例。如果您希望两个R a bs 相同,并且数据构造函数相同,并且它们对应的参数相同,那么您只需让编译器为您的实例派生:

data Row a b = R a b deriving (Eq, Show)
Run Code Online (Sandbox Code Playgroud)