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。
作為一個最小的完整定義被排除在外的決定(>)是武斷的,還是我遺漏了什么?
uj5u.com熱心網友回復:
我認為來源對此有所了解:
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而比較本身是根據<=. 選擇有點隨意(盡管正如 Willem van Onsem 所寫,它可能源于數學傳統),但這確實排除了允許使用額外的運算子作為最小定義。只能有一個默認定義compare。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/431369.html
