haskell - 在我的关系数据类型中实例化 Eq 时遇到问题

标签 haskell

我被困在实例化以下内容:

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/

相关文章:

haskell - 索引foldr如何运作?

haskell - 如何在 hsparql 中指定语言文字?

haskell - .~ 的 Monadic 版本(Haskell)

haskell - 我如何在列表的排列和子序列列表上 "put a restriction"?

Haskell:并行计算和monads的 'sequential property'

list - Haskell 列表 Monad 状态依赖

haskell - Haskell 中的 SOAP Web 服务?

haskell - Haskell 数据类型的内存占用

haskell - Haskell 的计算机视觉库

haskell - 为什么它没有显示为评估的?