6

我想知道 的Ord实例声明(a,b),我想快速查找一下 hackage 以确认我的直觉,即比较首先打开a,然后在相等的情况下打开b。具体来说我去了这里。由于 hackage 有指向数据声明和函数的源代码的链接,我假设也会有实例声明的源代码,但我找不到它们。他们不在那里是有原因的,还是我看起来不够努力?type Answer = Either Explanation Directions:)

4

3 回答 3

4

查看 Prelude,点击typeclass的源链接Ord,向下滚动一点,发现它被定义为

deriving instance (Ord a, Ord b) => Ord (a, b)

它使用StandaloneDeriving扩展。基本上它生成的代码与类型定义为

data (a, b) = (a, b) deriving Ord
于 2012-05-02T12:56:59.340 回答
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)
于 2012-05-02T13:03:44.087 回答
4

Haskell 98 报告在第 10.1 节中指定了这一点:

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

派生比较总是从左到右遍历构造函数。

...

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

于 2012-05-02T13:52:04.243 回答