为什么enum typeclass不是ord typeclass的子类?

时间:2019-11-08 05:55:15

标签: haskell typeclass

我想知道为什么枚举类型类不继承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 |否则= []

1 个答案:

答案 0 :(得分:1)

Ord类型类旨在表示订单,除其他外,还需要传递性:如果a < bb < 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 < PaperPaper < Scissors,但是Rock < Scissors应该为true,{{1}暗示 not }。

succ Scissors = Rock实例在定义上面显示的Ord时无用。