4

我正在读这本书,它谈到了 typeclass 的定义Eq

等式中有两个函数==/=它们实现为:

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

书上说它们是相互递归的,函数的结果在另一个函数的项中。

我不明白的是,我在相互递归中看不到基本情况,也不明白为什么函数会停止并返回结果。

4

1 回答 1

7

有了这些定义,相互递归就不会停止——它会无限递归。这个想法是在实现类型类时用自己的基本情况覆盖两个定义之一Eq

因此,例如,如果您有一个类型,data Foo = Bar | Baz您的Eq实例可能如下所示:

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

这里我们只定义==,没有/=,所以/=会使用它的默认定义not (x == y)。然而,我们的定义==不会/=回调,因此它不再相互递归,并且将毫无问题地终止。

为和Eq提供默认实现的原因是,您可以决定是否要为或提供定义,即使您选择 . 也可以免费获得另一个。==/===/=/=

于 2013-06-26T11:05:44.663 回答