我已经创建了一个数据类型,需要使用instance使其成为相等类型类的一个实例。我的数据类型由值R a b组成。如果R x y
等于R c d
并且x
等于c
,我想使y
等于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
我认为这可能是错误的,因为类型a和b不一定必须在Equality类型类中。我不知道如何解决这个问题。
答案 0 :(得分:5)
鉴于您可以检查 [,1] [,2]
[1,] 7 1
[2,] 6 1
[3,] 6 1
[4,] 1 1
[5,] 1 1
[6,] 1 1
[7,] 1 1
[8,] 2 1
[9,] 2 1
[10,] 3 1
[11,] 1 1
[12,] 1 1
[13,] 3 1
[14,] 3 1
[15,] 2 1
和R a b
的项目是否相等,因此您只能检查两个a
是否相等。因此,您需要将它们添加为类型约束:
b
但是请注意,您不需要自己需要实现instance (Eq a, Eq b) => Eq (Row a b) where
(R x y) == (R c d) = (x == c) && (y == d)
_ == _ = False
实例。如果您希望两个Eq
相同,并且数据构造函数相同,并且它们对应的参数相同,那么只需让编译器为您派生实例:
R a b