《Real World Haskell》中有这个例子:
class BasicEq3 a where
isEqual3 :: a -> a -> Bool
isEqual3 x y = not (isNotEqual3 x y)
isNotEqual3 :: a -> a -> Bool
isNotEqual3 x y = not (isEqual3 x y)
instance BasicEq3 Bool
当我在GHCI中运行它时:
#> isEqual3 False False
out of memory
所以,您必须至少实现其中一种方法,否则它将会循环。而且您可以灵活选择哪种方法,这很方便。
我的问题是,如果没有覆盖足够的默认值并且默认值形成了循环,是否有一种方法可以得到警告或其他东西?对我来说,编译器非常聪明,但这个例子似乎没问题。
Num
实例,没有-
或者negate
,但是其中的+
却不会评估它的第二个参数,因此它显然的循环定义将正常终止。这种总是丢弃第二个参数的方法是脱离非终止状态而不定义-
或者negate
的唯一方法。我认为这些是奇怪的用例,如果您想通过使用_
来避免循环定义,则需要指定-noarnundefinedcyclicmethods
。但是我不知道如何在 Trac 上引发这个问题。 - AndrewC