[英]How do the implementation of Eq typeclass function: x == y = not (x /= y) x /= y = not (x == y) work?
我正在读这本书 ,它谈到了类型Eq
的定义
在Eq中有两个函数==
, /=
,它们实现为:
x == y = not (x /= y)
x /= y = not (x == y)
书中说它们是相互递归的,函数的结果是在另一个函数的项目中。
我不明白的是我在相互递归中没有看到基本情况,我不明白为什么函数会停止并返回结果。
有了这些定义,相互递归就不会停止 - 它会无限地递归。 我们的想法是,在实现Eq
类型类时,您可以使用自己的基本情况覆盖两个定义中的一个。
因此,例如,如果您有类型data Foo = Bar | Baz
data Foo = Bar | Baz
您的Eq
实例可能如下所示:
instance Eq Foo where
Bar == Bar = True
Baz == Baz = True
_ == _ = False
这里我们只定义了==
,而不是/=
,所以/=
将使用其默认定义not (x == y)
。 但是我们对==
的定义不会调用/=
back,所以它不再相互递归并且会终止而没有问题。
Eq
为==
和/=
提供默认实现的原因是,您可以决定是否要为==
或/=
提供定义,即使您选择/=
也可以免费获得另一个定义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.