[英]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.