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



我想知道(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 的所有派生操作在这两个参数中都是严格的。

最新更新