我想知道为什么枚举类型类不继承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 < 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,但succ Scissors = Rock
并不暗示。Ord
实例在定义上面显示的Enum
时不会有用。关于haskell - 为什么enum typeclass不是ord typeclass的子类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58761160/