2013-06-26 115 views

回答

7

有了這些定義,相互遞歸不會停止 - 它會無限遞歸。這個想法是,當你實現Eq類型類時,用你自己的基本情況覆蓋兩個定義中的一個。

因此,舉例來說,如果你有一個類型data Foo = Bar | BazEq實例可以是這樣的:

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

在這裏我們只定義==,不/=,所以/=將使用其默認定義not (x == y)。然而我們的==定義不會叫/=回來,所以它不再相互遞歸將終止沒有任何問題。

Eq提供默認實現既==/=的原因是,這樣你就可以決定是否要爲==/=提供一個定義,你會得到免費的另外一個即使你選擇/=

+4

使用[我的建議(http://hackage.haskell.org/trac/ghc/ticket/7633) - 希望能夠在GHC的下一個版本 - 你可以指定一個類的最小的完整定義以編譯器可檢查的方式,這樣如果你沒有實現任何一種方法,你會得到一個警告。 – shachaf

+0

@ sepp2k感謝您的解釋。事實上,下面這本書中有一個解釋,但我不知道它存在... – code4j

相關問題