Haskell 在typeclass实现中定义变量时发生冲突
我正在尝试为以下数据实现Eq类类型:Haskell 在typeclass实现中定义变量时发生冲突,haskell,typeclass,Haskell,Typeclass,我正在尝试为以下数据实现Eq类类型: data Pair a = Pair a a instance Eq a => Eq (Pair a) where (==) (Pair x x) (Pair y y) = (x == y) 我收到以下错误消息: 在…中对“y”的定义存在冲突 我的问题是: 我认为我是在“按部就班地”做事,那么为什么我会犯这样的错误呢 如果我正在重新定义y,为什么x没有类似的错误 上述代码中的“重新定义”在哪里 假设正在拨打以下电话: (Pair 1 2) =
data Pair a = Pair a a
instance Eq a => Eq (Pair a) where
(==) (Pair x x) (Pair y y) = (x == y)
我收到以下错误消息:
在…中对“y”的定义存在冲突
我的问题是:
y
,为什么x
没有类似的错误假设正在拨打以下电话:
(Pair 1 2) == (Pair 3 4)
此时,值1将指定给x:
(==) (Pair x...
此时,x被重新指定为不允许的值2:
(==) (Pair x x...
因此出现了错误
至于第二个问题的答案,你应该得到x和y的一个错误,如下所示:
Test.hs:6:16:
Conflicting definitions for `x'
Bound at: Test.hs:6:16
Test.hs:6:18
In an equation for `=='
Test.hs:6:27:
Conflicting definitions for `y'
Bound at: Test.hs:6:27
Test.hs:6:29
In an equation for `=='
提示:如果您评估
对12==对12
,那么x
和y
会是什么?嗯!有没有可能一开始就有一对12。可能我的错误是认为数据构造函数中的2具有相同的值。我将代码的最后一行重新实现为:(==)(对xy)(对zm)=(x==z&&y==m)现在没有错误。谢谢你,没错。它们有相同的类型,这就是数据对a=对a
所说的;但很明显,大多数类型都允许不止一个值!我同意。虽然我的重新实现或@vanson samuel的建议让编译器感到高兴(没错),但我仍然不清楚错误消息本身:在我的第一段代码中,重新定义发生在哪里?是的,谢谢@vanson samuel。通过您引用的示例,现在可以更清楚地看到重新定义发生在何处。