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)
书中说它们是相互递归的,函数的结果是在另一个函数的项目中.
我不明白的是我在相互递归中没有看到基本情况,我不明白为什么函数会停止并返回结果.
有了这些定义,相互递归就不会停止 - 它会无限地递归.我们的想法是,在实现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提供默认实现都==和/=是这样您就可以决定是否要对提供的定义==或者/=,你会得到另一种免费的,即使您选择/=.