标准类型类实例声明的源代码

6

我想了解关于对于 (a,b)Ord 实例声明,想要在 hackage 上快速查找以确认我的直觉:比较首先是在 a 上,然后在相等的情况下在 b 上。具体来说,我去了 这里。由于 hackage 有数据声明和函数的源代码链接,所以我认为实例声明也会有源代码,但我找不到它们。它们为什么不在那里,还是我没有找到?type Answer = Either Explanation Directions :)


3
Haddock中有一个未解决的问题,需要添加源链接以供查看实例,这将使查找实例变得更加容易。 - hammar
非常感谢。所有的答案都很好,每个答案都有一些额外的信息,使它们与其他答案不同。 - Boris
3个回答

4
我去了 Prelude 中寻找, 点击了Ord类型类的源链接, 往下滚动了一点,发现它被定义为:
deriving instance (Ord a, Ord b) => Ord (a, b)

它正在使用StandaloneDeriving扩展。基本上,它生成的代码与类型定义为相同。
data (a, b) = (a, b) deriving Ord

4

Ord实例适用于元组,根据语言规范的规则推导而来,这些规则可以追溯到Gofer时代

instance (Eq a, Eq b) => Eq (a,b) where
    (x,y) == (u,v)  =  x==u && y==v

instance (Ord a, Ord b) => Ord (a,b) where
    (x,y) <= (u,v)  = x<u  ||  (x==u && y<=v)

4

Haskell 98报告在第10.1节中指定了以下内容:

由Eq和Ord的派生实例自动引入的类方法是(==), (/=), compare, (<), (<=), (>), (>=), max和min。后面七个运算符的定义是根据构造器集合按字典顺序比较它们的参数,对于数据类型声明中较早的构造器,计数为小于较晚的构造器。

派生比较始终从左到右遍历构造器。

...

所有类Eq和Ord的派生操作在两个参数中都是严格的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接