我想知道为什么枚举类型类不继承ord类型类的原因。枚举中的succ函数本质上对值施加了顺序,但ord并不是必需的约束。
编辑: 同样,对于类型类中的其他函数,似乎有一个隐式假设,即为它们定义了ord运算符。如图https://hackage.haskell.org/package/base-4.12.0.0/docs/Prelude.html#v:enumFromTo
可能的实现是enumFromTo n m | n <= m = n:enumFromTo(succ n)m |否则= []
答案 0 :(得分:1)
Ord
类型类旨在表示总订单,除其他外,还需要传递性:如果a < b
和b < c
,则a < c
定义一个类的实例时,必须有一个超类。
尽管Enum
可能会在其元素上强加一个顺序(尽管不一定是总数),但不会使用或需要进行总体订购。
作为一个例子,考虑每个人最喜欢的决策算法:
data RPS = Rock | Paper | Scissors deriving (Eq, Ord)
instance Enum RPS where
succ Rock = Paper
succ Paper = Scissors
succ Scissors = Rock
从该定义派生的Ord
实例是总计的,并且很直接:Rock
是最小的元素,Scissors
是最大的元素,而Paper
位于两者之间。
此枚举所隐含的顺序不是总计。给定succ
,您可能会假设Rock < Paper
和Paper < Scissors
,但是Rock < Scissors
应该为true,{{1}暗示 not }。
succ Scissors = Rock
实例在定义上面显示的Ord
时无用。