我正在读这本书,它谈到了 typeclass 的定义Eq
等式中有两个函数==
,/=
它们实现为:
x == y = not (x /= y)
x /= y = not (x == y)
书上说它们是相互递归的,函数的结果在另一个函数的项中。
我不明白的是,我在相互递归中看不到基本情况,也不明白为什么函数会停止并返回结果。
我正在读这本书,它谈到了 typeclass 的定义Eq
等式中有两个函数==
,/=
它们实现为:
x == y = not (x /= y)
x /= y = not (x == y)
书上说它们是相互递归的,函数的结果在另一个函数的项中。
我不明白的是,我在相互递归中看不到基本情况,也不明白为什么函数会停止并返回结果。
有了这些定义,相互递归就不会停止——它会无限递归。这个想法是在实现类型类时用自己的基本情况覆盖两个定义之一Eq
。
因此,例如,如果您有一个类型,data Foo = Bar | Baz
您的Eq
实例可能如下所示:
instance Eq Foo where
Bar == Bar = True
Baz == Baz = True
_ == _ = False
这里我们只定义==
,没有/=
,所以/=
会使用它的默认定义not (x == y)
。然而,我们的定义==
不会/=
回调,因此它不再相互递归,并且将毫无问题地终止。
为和Eq
提供默认实现的原因是,您可以决定是否要为或提供定义,即使您选择 . 也可以免费获得另一个。==
/=
==
/=
/=