我想了解关于对于 (a,b)
的 Ord
实例声明,想要在 hackage 上快速查找以确认我的直觉:比较首先是在 a
上,然后在相等的情况下在 b
上。具体来说,我去了 这里。由于 hackage 有数据声明和函数的源代码链接,所以我认为实例声明也会有源代码,但我找不到它们。它们为什么不在那里,还是我没有找到?type Answer = Either Explanation Directions
:)
我想了解关于对于 (a,b)
的 Ord
实例声明,想要在 hackage 上快速查找以确认我的直觉:比较首先是在 a
上,然后在相等的情况下在 b
上。具体来说,我去了 这里。由于 hackage 有数据声明和函数的源代码链接,所以我认为实例声明也会有源代码,但我找不到它们。它们为什么不在那里,还是我没有找到?type Answer = Either Explanation Directions
:)
Ord
类型类的源链接, 往下滚动了一点,发现它被定义为:deriving instance (Ord a, Ord b) => Ord (a, b)
data (a, b) = (a, b) deriving Ord
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)
Haskell 98报告在第10.1节中指定了以下内容:
由Eq和Ord的派生实例自动引入的类方法是(==), (/=), compare, (<), (<=), (>), (>=), max和min。后面七个运算符的定义是根据构造器集合按字典顺序比较它们的参数,对于数据类型声明中较早的构造器,计数为小于较晚的构造器。
派生比较始终从左到右遍历构造器。
...
所有类Eq和Ord的派生操作在两个参数中都是严格的。