私は本を読んでいます、そしてそれは型クラスの定義について語っています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の定義を提供するかどうかを決定できるようにするためです。==/===/=/=