我理解在haskell中如果我们创建一个数据类型派生Ord它也应该派生Eq,但为什么我们必须在定义中明确地写出它们?
答案 0 :(得分:5)
可以合理地推导Ord
,但手动实例化Eq
:
data Foo = Foo deriving Ord
instance Eq Foo where
_ == _ = True
我无法想到一个有用的地方,但是没有理由阻止它。
答案 1 :(得分:2)
您需要编写Eq
,原因与在为Eq
编写实例之前必须为Ord
编写实例的原因相同(或者至少在编译之前)。可以推导出一个,但该属性不适用于所有类型类上下文,因此您需要明确。
编译器可以很容易地知道派生Eq
(并且这可能是相当无害的),但是如果没有明确要求它,可能会有一些惊喜产生类型类的实例。如果它以某种方式发生在更复杂的类型类中,这可能会非常混乱。