Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 在typeclass实现中定义变量时发生冲突_Haskell_Typeclass - Fatal编程技术网

Haskell 在typeclass实现中定义变量时发生冲突

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) =

我正在尝试为以下数据实现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) == (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。通过您引用的示例,现在可以更清楚地看到重新定义发生在何处。