haskell - 在我的关系数据类型中实例化 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
可能是一个列表,所以简单(==)
不会真正起作用,对吗?
任何提示都非常感谢!
解决方案
你为什么不写:
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
实例等等。
推荐阅读
- python - 熊猫的左合并:结果表有更多行,防止重复
- sas - 如何从 SAS 中的数据集创建集群?我对解决方案的尝试如下;
- angular - NativeScript 如何将数据从服务传递到组件?
- excel - Python Openpyxl sheet.dimensions
- c# - peta poco .net 分页查询添加的“PETA_PAGED”附近的语法不正确
- mongodb - count() 和 find() 结果不一样
- php - WooCommerce - 在单个产品页面模板上显示产品类别图像
- java - D/skia:libjpeg 错误 117
我不是门控错误,但是当我单击 recyclerview-> 图像视图时
D/skia: libjpeg error 117 <Corrupt JPEG data: premature end of data segment> from o
- excel - 我想替换 Excel 表中的特定列数据
- angular - 将数字类型转换为 BigDecimal TypeScript ( Angular)