私は本を読んでいます、そしてそれは型クラスの定義について語っていますEq
==
式には 2 つの関数があり/=
、次のように実装されます。
x == y = not (x /= y)
x /= y = not (x == y)
本によると、それらは相互再帰であり、関数の結果は別の関数の項目にあります。
私が理解していないのは、相互再帰に基本ケースが表示されないことと、関数が停止して結果を返す理由が理解できないことです。
私は本を読んでいます、そしてそれは型クラスの定義について語っていますEq
==
式には 2 つの関数があり/=
、次のように実装されます。
x == y = not (x /= y)
x /= y = not (x == y)
本によると、それらは相互再帰であり、関数の結果は別の関数の項目にあります。
私が理解していないのは、相互再帰に基本ケースが表示されないことと、関数が停止して結果を返す理由が理解できないことです。
これらの定義では、相互再帰は止まらず、無限に再帰します。アイデアは、型クラスを実装するときに、独自の基本ケースで 2 つの定義のいずれかをオーバーライドすることですEq
。
たとえば、タイプがある場合data Foo = Bar | Baz
、Eq
インスタンスは次のようになります。
instance Eq Foo where
Bar == Bar = True
Baz == Baz = True
_ == _ = False
ここでは のみを定義し、 は定義==
しない/=
ので/=
、デフォルトの定義を使用しますnot (x == y)
。ただし、==
will の定義はコール/=
バックしないため、相互に再帰的ではなくなり、問題なく終了します。
と の両方にEq
既定の実装を提供する理由は、 orの定義を提供するかどうかを決定できるようにするためです。==
/=
==
/=
/=