我被困在实例化以下内容:
data Rel a = R [(a,a)] deriving (Read, Show)
listaPares:: Rel a -> [(a,a)]
listaPares (R rel) = rel
instance Eq (Rel a) where
x == y = ((fst $ listaPares x == fst $ listaPares y) && (snd $ listaPares x == snd $ listaPares y))
Rel
是一种保存元组列表的数据类型,元组内的元素可以是任何内容,可以是整数、字符甚至列表。
我的方法listaPares
采用类型Rel
并返回元组列表,以便我可以操作该列表。
问题是我真的很难实例化我的数据类型的Eq
。我现在正在做的是获取 x 元组的第一个元素,并检查它是否与 y 元组的第一个元素相同,依此类推,但由于 a
可能是一个列表,一个简单的(==)
不会真正起作用,对吗?
非常感谢任何提示!
最佳答案
你为什么不写:
data Rel a = R [(a,a)] deriving (Read, Show, Eq)
效果很好。
就列表相等性而言,实际上存在一个 Eq a => Eq [a]
的实例。还有 (Eq a, Eq b) => Eq (a, b)
,在您的情况下可以简化为 Eq a => Eq (a,a)
.
因此,如果 Eq a
成立,则 Eq (a,a)
成立,因此 Eq [(a,a)]
成立很好,可以推导出来。
在您手动编写的尝试中,您实际上忘记了 Eq a
约束,这是它正常工作所必需的。 a
是什么并不重要,它可以是一个列表,只要列表元素的类型也有一个 Eq
实例等等。
关于haskell - 在我的关系数据类型中实例化 Eq 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65870923/