如何实现Eq类型类函数:x == y = not(x/= y)x/= y = not(x == y)工作?

cod*_*e4j 4 recursion haskell typeclass mutual-recursion

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

在Eq中有两个函数==,/=它们实现为:

  x == y = not (x /= y)  
  x /= y = not (x == y)  
Run Code Online (Sandbox Code Playgroud)

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

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

sep*_*p2k 7

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

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

instance Eq Foo where
  Bar == Bar = True
  Baz == Baz = True
  _   == _   = False
Run Code Online (Sandbox Code Playgroud)

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

其原因Eq提供默认实现都==/=是这样您就可以决定是否要对提供的定义==或者/=,你会得到另一种免费的,即使您选择/=.

  • 使用[我的建议(http://hackage.haskell.org/trac/ghc/ticket/7633) - 希望能够在GHC的下一个版本 - 你可以在编译器中指定一个类的最小的完整定义 - 可检查的方式,如果你没有实现任何一种方法,你会收到警告. (4认同)