{- Hi. May we please have a partial order class in Haskell at some stage? It can be done outside the prelude (see below), but would be nicer inside (see below, removing all the tildes and primes). Something similar could be done with abstract algebra above the Num and Fractional classes: Group defining (+), negate, (-), and zero; Ring defining (*); and Field defining (/), recip, and one. I'm not so fussed about these, though. Regards, Tom -} data PartialOrdering = PLT | PEQ | PGT | PUnrelated deriving (Eq, Ord, Ix, Enum, Read, Show, Bounded) class Eq a => PartialOrd a where partialCompare :: a -> a -> PartialOrdering (<=~), (<~), (>=~), (>~) :: a -> a -> Bool -- Minimal complete definition: partialCompare or (<=~) partialCompare x y | x == y = PEQ | x <=~ y = PLT | y <=~ x = PGT | otherwise = PUnrelated x <=~ y = partialCompare x y < PGT x <~ y = partialCompare x y == PLT x >=~ y = partialCompare y x < PGT x >~ y = partialCompare y x == PLT class PartialOrd a => Ord' a where compare' :: a -> a -> Ordering max', min' :: a -> a -> a -- Minimal complete definition: None compare' x y | x == y = EQ | x <=~ y = LT | otherwise = GT max' x y | x >=~ y = x | otherwise = y min' x y | x <=~ y = x | otherwise = y