Haskell Eq定义实现结果

Mat*_*att 6 haskell typeclass

我正在阅读数据库中Eq类型类的定义,我很困惑.在什么时候它意识到两个值相等或不相等.从我看来,看起来他们只是无限地互相呼叫.

它定义如下:

class  Eq a  where
    (==), (/=)           :: a -> a -> Bool

    x /= y               = not (x == y)
    x == y               = not (x /= y)
Run Code Online (Sandbox Code Playgroud)

有人会介意解释它在哪里实现Bool价值吗?他们甚至互相打电话,还是其他事情发生了?

Jos*_*Lee 11

这是这些方法的默认实现,是的,它是循环的.如果你按原样使用它们,你将循环:

data Foo = Foo
instance Eq Foo
Run Code Online (Sandbox Code Playgroud)
> Foo == Foo
^CInterrupted
Run Code Online (Sandbox Code Playgroud)

存在循环定义,因此您可以实现免费(==)获取(/=),反之亦然:

data Foo = Foo
instance Eq Foo where
  x == y = True
Run Code Online (Sandbox Code Playgroud)
> Foo /= Foo
False
Run Code Online (Sandbox Code Playgroud)

另请参阅Ord类,它解释了特定情况下最小完整定义的含义.

  • @ Code-Guru:如果你好奇,你总能看到`-ddump-deriv` GHC标志的派生实例 (3认同)
  • @ Code-Guru派生实例测试两个值具有相同的构造函数,并且构造函数都由相等的字段填充. (2认同)