haskell - 最小完整定义 Ord 是如何选择的?

标签 haskell typeclass

Data.Ord 包括这些方法:

compare :: a -> a -> Ordering

(<) :: a -> a -> Bool

(<=) :: a -> a -> Bool

(>) :: a -> a -> Bool

(>=) :: a -> a -> Bool

max :: a -> a -> a

min :: a -> a -> a
最小的完整定义是compare | (<=) .
我了解如何从这两种方法中的任何一种中确定其他方法。
我不明白为什么(>) (例如)也不能用作最小的完整定义。 not (a > b)相当于a <= b .
是对 (>) 的决定吗?作为一个最小的完整定义被排除在外,还是我遗漏了什么?

最佳答案

我认为 the source对此有一点启发:

class  (Eq a) => Ord a  where
    compare              :: a -> a -> Ordering
    (<), (<=), (>), (>=) :: a -> a -> Bool
    max, min             :: a -> a -> a

    compare x y = if x == y then EQ
                  else if x <= y then LT
                  else GT

    x <  y = case compare x y of { LT -> True;  _ -> False }
    x <= y = case compare x y of { GT -> False; _ -> True }
    x >  y = case compare x y of { GT -> True;  _ -> False }
    x >= y = case compare x y of { LT -> False; _ -> True }
如您所见,所有比较都是根据 compare 实现的。和 compare 本身是根据 <= 实现的.选择有点随意(尽管正如 Willem van Onsem 所写,它可能源于数学传统),但这确实排除了允许使用额外的运算符作为最小定义。 compare 只能有一个默认定义.

关于haskell - 最小完整定义 Ord 是如何选择的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71211495/

相关文章:

haskell - 使受约束的函数成为类型类实例

haskell - 为什么说类型类是存在的?

haskell - 打印两个数字的总和 Haskell

haskell - 数字类型的相等性如何工作?

haskell - 对透镜类型进行抽象以提供更好的属性读写控制

haskell - 为什么 "constraint trick"在这个手动定义的 HasField 实例中不起作用?

haskell:读取不解析没有显式类型的 float

haskell - stack 如何从 extra-deps 中找到包?

Haskell 刚性类型?

haskell - "Subclassing"Haskell 中的一种类型