什么决定了Haskell中的数据构造函数顺序?
当我在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
[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.1Eq
和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