6

我正在阅读Eq数据库中类型类的定义,我很困惑。在什么时候意识到两个值相等或不相等。据我所知,他们似乎只是无限地互相称呼。

它是这样定义的:

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

    x /= y               = not (x == y)
    x == y               = not (x /= y)

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

4

1 回答 1

11

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

data Foo = Foo
instance Eq Foo
> Foo == Foo
^CInterrupted

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

data Foo = Foo
instance Eq Foo where
  x == y = True
> Foo /= Foo
False

另请参阅Ord类,它解释了在该特定情况下最小完整定义是什么。

于 2013-01-08T22:15:04.597 回答