我正在阅读数据库中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类,它解释了特定情况下最小完整定义的含义.