我正在阅读数据库中Eq
类型类的定义,我很困惑。在什么时候它意识到两个值相等或不相等。从我看来,看起来他们只是无限地互相称呼。
它定义如下:
class Eq a where
(==), (/=) :: a -> a -> Bool
x /= y = not (x == y)
x == y = not (x /= y)
有人会介意解释它实现Bool
值的位置吗?他们甚至互相打电话,还是其他事情发生了?
答案 0 :(得分:11)
这是这些方法的默认实现,是的,它是循环的。如果你按原样使用它们,你将循环:
data Foo = Foo
instance Eq Foo
> Foo == Foo
^CInterrupted
存在循环定义,因此您可以免费实施(==)
并获取(/=)
,反之亦然:
data Foo = Foo
instance Eq Foo where
x == y = True
> Foo /= Foo
False
另请参阅Ord类,该类解释了特定情况下最小完整定义的内容。