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