我想知道为什么枚举类型类不继承ord类型类的原因。枚举中的succ函数本质上对值施加了顺序,但是ord并不是必需的约束。

编辑:
另外,对于类型类中的其他函数,似乎有一个隐式假设,即为它们定义了ord运算符。如此处所示https://hackage.haskell.org/package/base-4.12.0.0/docs/Prelude.html#v:enumFromTo


可能的实现是enumFromTo n m | n

最佳答案

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,但succ Scissors = Rock并不暗示。

Ord实例在定义上面显示的Enum时不会有用。

关于haskell - 为什么enum typeclass不是ord typeclass的子类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58761160/

10-11 17:27