如果我们在创建数据类型时派生Ord而不是Eq会发生什么?

时间:2017-08-17 01:32:38

标签: haskell

我理解在haskell中如果我们创建一个数据类型派生Ord它也应该派生Eq,但为什么我们必须在定义中明确地写出它们?

2 个答案:

答案 0 :(得分:5)

可以合理地推导Ord,但手动实例化Eq

data Foo = Foo deriving Ord
instance Eq Foo where
    _ == _ = True

我无法想到一个有用的地方,但是没有理由阻止它。

答案 1 :(得分:2)

您需要编写Eq,原因与在为Eq编写实例之前必须为Ord编写实例的原因相同(或者至少在编译之前)。可以推导出一个,但该属性不适用于所有类型类上下文,因此您需要明确。

编译器可以很容易地知道派生Eq(并且这可能是相当无害的),但是如果没有明确要求它,可能会有一些惊喜产生类型类的实例。如果它以某种方式发生在更复杂的类型类中,这可能会非常混乱。