首页 > 解决方案 > 在我的关系数据类型中实例化 Eq 时遇到问题

问题描述

我被困在以下实例中:

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可能是一个列表,所以简单(==)不会真正起作用,对吗?

任何提示都非常感谢!

标签: haskell

解决方案


你为什么不写:

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实例等等。


推荐阅读