2013-06-26 116 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

相关问题