我想知道(a,b)
的Ord
实例声明,我想对hackage进行快速查找,以确认我的直觉,即比较首先在a
上,然后在相等的情况下,在b
上。具体来说,我去了这里。由于hackage具有指向数据声明和函数源代码的链接,因此我假设实例声明也会有源代码,但我找不到它们。是他们不在那里的原因,还是我只是不够努力? type Answer = Either Explanation Directions
:)
我去寻找Prelude,点击Ord
typeclass的源链接,向下滚动一点,发现它被定义为
deriving instance (Ord a, Ord b) => Ord (a, b)
它使用的是 StandaloneDeriving 扩展。基本上,它生成与类型定义为相同的代码
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 是 (==)、(/=)、比较、(<)、(<=)、(>)、(>=)、最大值和最小值。 定义后七个运算符是为了比较它们的 关于给定构造函数集的字典顺序参数, 数据类型声明中的早期构造函数计为 比后来的要小。
派生比较始终从左到右遍历构造函数。
。
类 Eq 和 Ord 的所有派生操作在这两个参数中都是严格的。