6

EqData ライブラリの型クラスの定義を読んでいましたが、混乱しています。どの時点で、2 つの値が等しいか等しくないかが認識されます。私が見たところ、彼らはお互いを無限に呼び合うように見えます.

次のように定義されています。

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 に答える