4

私はを​​読んでいます、そしてそれは型クラスの定義について語っていますEq

==式には 2 つの関数があり/=、次のように実装されます。

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

本によると、それらは相互再帰であり、関数の結果は別の関数の項目にあります。

私が理解していないのは、相互再帰に基本ケースが表示されないことと、関数が停止して結果を返す理由が理解できないことです。

4

1 に答える 1

7

これらの定義では、相互再帰は止まらず、無限に再帰します。アイデアは、型クラスを実装するときに、独自の基本ケースで 2 つの定義のいずれかをオーバーライドすることですEq

たとえば、タイプがある場合data Foo = Bar | BazEqインスタンスは次のようになります。

instance Eq Foo where
  Bar == Bar = True
  Baz == Baz = True
  _   == _   = False

ここでは のみを定義し、 は定義==しない/=ので/=、デフォルトの定義を使用しますnot (x == y)。ただし、==will の定義はコール/=バックしないため、相互に再帰的ではなくなり、問題なく終了します。

と の両方にEq既定の実装を提供する理由は、 orの定義を提供するかどうかを決定できるようにするためです。==/===/=/=

于 2013-06-26T11:05:44.663 に答える