什么决定了Haskell中的数据构造函数顺序?

什么决定了Haskell中的数据构造函数顺序?,haskell,Haskell,当我在Haskell上运行此命令时: [2] <= [1,5] [2]指定自动派生实例的外观: import Data.Monoid((<>)) instance Ord ([] a) where compare [] [] = EQ compare [] (_:_) = LT compare (_:_) [] = GT compare (ha:ta) (hb:tb) = compare ha hb <> compare ta t

当我在Haskell上运行此命令时:

[2] <= [1,5]
[2]指定自动派生实例的外观:

import Data.Monoid((<>))

instance Ord ([] a) where
    compare [] [] = EQ
    compare [] (_:_) = LT
    compare (_:_) [] = GT
    compare (ha:ta) (hb:tb) = compare ha hb <> compare ta tb
10.1
Eq
Ord
的派生实例

类的派生实例自动引入的类方法
Eq
Ord
(==)
(/=)
比较
(=)
最大值
最小值
后七个运算符的定义如下 从词典的角度比较他们的论点 给定构造函数集,数据类型中包含早期构造函数 声明计数比后面的声明小

例如,对于
Bool
数据类型,我们有
(True>False)==
正确

派生比较始终从左到右遍历构造函数 右。这些示例说明了此属性:

  (1,undefined) == (2,undefined) =>    False
  (undefined,1) == (undefined,2) =>    _|_
Eq
Ord
的所有派生运算在这两个方面都是严格的
论据。例如,<代码> false > P>自动生成的<代码> ORD < /C>实例将考虑一个值小于另一个值,如果构造函数出现在构造函数列表中的另一个值之前。如果构造函数相同,它将按字典顺序成对比较元素。如果我们假定
[]
之前,列表的
Ord
实例的作用是相同的


[2]不,Haskell将首先对“自动生成的”Ord
的构造函数进行比较(按照定义的顺序)。只有当数据构造函数相同时,它才会按字典顺序比较参数。“您是否可以使用
-ddump deriv
标志查看由
派生
生成的实例,并使用
-dsuppress uniques
-dsuppress module前缀
等选项使输出更具可读性。这些选项可以添加到命令行、Cabal文件中的
ghc options
字段中,或者在模块中使用pragma
{-#options_ghc-ddump deriv-dsuppress uniques-dsuppress module prefixes}
instance Ord T where
    (<=) A A = True
    (<=) A B = True
    (<=) A (C _ _) = True
    (<=) B C = True
    (<=) B (C _ _) = True
    (<=) (C xa ya) (C xb yb) = xa <= xb || (xa == xb && ya <= yb)
    (<=) _ _ = False
data [] a = [] | (:) a ([] a)
import Data.Monoid((<>))

instance Ord ([] a) where
    compare [] [] = EQ
    compare [] (_:_) = LT
    compare (_:_) [] = GT
    compare (ha:ta) (hb:tb) = compare ha hb <> compare ta tb