easytensor-2.0.0.0: Pure, type-indexed haskell vector, matrix, and tensor library.

Copyright(c) Artem Chirkin
LicenseBSD3
Safe HaskellNone
LanguageHaskell2010

Numeric.ProductOrd.NonTransitive

Description

Compare product types using non-transitive Ord instances:

  • \( a = b \) and \( b = c \) does not mean \( a = c \);
  • but, if nor \( a > b \) neither \( b > a \), then \( a = b \).

To remind yourself that ProductOrd is not fully faithful, you may import it qualified, e.g.

 import qualified Numeric.ProductOrd.NonTransitive as NonTransitive
Synopsis

Documentation

newtype ProductOrd a Source #

Redefine Ord instance for a type which is a cartesian product -- as a partial product order.

Since vanilla Haskell Ord class is always about total order, ProductOrd instance is not particularly correct. However, it turns out to be very useful for comparing vector or tuple-like types.

The implementation of ProductOrd in this module workarounds this by using a non-transitive Eq instance: \[ a = b \iff \neg (a > b) \land \neg (b > a) \]

Another inconsistency with the Haskell Report is the min and max functions; these are simply element-wise minimum and maximum here. Thus, these instances preserve important properties like min a b <= a && min a b <= b, but do not preserve a property that min a b == a || min a b == b.

All of this is really useful in geometry applications and for calculating things like Pareto dominance, but should be used with care. Remember about this if you want to put a ProductOrd into a Set or a Map!

Constructors

ProductOrd 

Fields

Instances
Monad ProductOrd Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Methods

(>>=) :: ProductOrd a -> (a -> ProductOrd b) -> ProductOrd b #

(>>) :: ProductOrd a -> ProductOrd b -> ProductOrd b #

return :: a -> ProductOrd a #

fail :: String -> ProductOrd a #

Functor ProductOrd Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Methods

fmap :: (a -> b) -> ProductOrd a -> ProductOrd b #

(<$) :: a -> ProductOrd b -> ProductOrd a #

MonadFix ProductOrd Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Methods

mfix :: (a -> ProductOrd a) -> ProductOrd a #

Applicative ProductOrd Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Methods

pure :: a -> ProductOrd a #

(<*>) :: ProductOrd (a -> b) -> ProductOrd a -> ProductOrd b #

liftA2 :: (a -> b -> c) -> ProductOrd a -> ProductOrd b -> ProductOrd c #

(*>) :: ProductOrd a -> ProductOrd b -> ProductOrd b #

(<*) :: ProductOrd a -> ProductOrd b -> ProductOrd a #

Foldable ProductOrd Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Methods

fold :: Monoid m => ProductOrd m -> m #

foldMap :: Monoid m => (a -> m) -> ProductOrd a -> m #

foldr :: (a -> b -> b) -> b -> ProductOrd a -> b #

foldr' :: (a -> b -> b) -> b -> ProductOrd a -> b #

foldl :: (b -> a -> b) -> b -> ProductOrd a -> b #

foldl' :: (b -> a -> b) -> b -> ProductOrd a -> b #

foldr1 :: (a -> a -> a) -> ProductOrd a -> a #

foldl1 :: (a -> a -> a) -> ProductOrd a -> a #

toList :: ProductOrd a -> [a] #

null :: ProductOrd a -> Bool #

length :: ProductOrd a -> Int #

elem :: Eq a => a -> ProductOrd a -> Bool #

maximum :: Ord a => ProductOrd a -> a #

minimum :: Ord a => ProductOrd a -> a #

sum :: Num a => ProductOrd a -> a #

product :: Num a => ProductOrd a -> a #

Traversable ProductOrd Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Methods

traverse :: Applicative f => (a -> f b) -> ProductOrd a -> f (ProductOrd b) #

sequenceA :: Applicative f => ProductOrd (f a) -> f (ProductOrd a) #

mapM :: Monad m => (a -> m b) -> ProductOrd a -> m (ProductOrd b) #

sequence :: Monad m => ProductOrd (m a) -> m (ProductOrd a) #

MonadZip ProductOrd Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Methods

mzip :: ProductOrd a -> ProductOrd b -> ProductOrd (a, b) #

mzipWith :: (a -> b -> c) -> ProductOrd a -> ProductOrd b -> ProductOrd c #

munzip :: ProductOrd (a, b) -> (ProductOrd a, ProductOrd b) #

Bounded a => Bounded (ProductOrd a) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Enum a => Enum (ProductOrd a) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Ord (ProductOrd a) => Eq (ProductOrd a) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Methods

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

(/=) :: ProductOrd a -> ProductOrd a -> Bool #

Floating a => Floating (ProductOrd a) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Fractional a => Fractional (ProductOrd a) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

(Ord (ProductOrd a), Integral a) => Integral (ProductOrd a) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Data a => Data (ProductOrd a) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> ProductOrd a -> c (ProductOrd a) #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (ProductOrd a) #

toConstr :: ProductOrd a -> Constr #

dataTypeOf :: ProductOrd a -> DataType #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (ProductOrd a)) #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (ProductOrd a)) #

gmapT :: (forall b. Data b => b -> b) -> ProductOrd a -> ProductOrd a #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> ProductOrd a -> r #

gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> ProductOrd a -> r #

gmapQ :: (forall d. Data d => d -> u) -> ProductOrd a -> [u] #

gmapQi :: Int -> (forall d. Data d => d -> u) -> ProductOrd a -> u #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> ProductOrd a -> m (ProductOrd a) #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> ProductOrd a -> m (ProductOrd a) #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> ProductOrd a -> m (ProductOrd a) #

Num a => Num (ProductOrd a) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

(Ord a1, Ord a2) => Ord (ProductOrd (a1, a2)) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Methods

compare :: ProductOrd (a1, a2) -> ProductOrd (a1, a2) -> Ordering #

(<) :: ProductOrd (a1, a2) -> ProductOrd (a1, a2) -> Bool #

(<=) :: ProductOrd (a1, a2) -> ProductOrd (a1, a2) -> Bool #

(>) :: ProductOrd (a1, a2) -> ProductOrd (a1, a2) -> Bool #

(>=) :: ProductOrd (a1, a2) -> ProductOrd (a1, a2) -> Bool #

max :: ProductOrd (a1, a2) -> ProductOrd (a1, a2) -> ProductOrd (a1, a2) #

min :: ProductOrd (a1, a2) -> ProductOrd (a1, a2) -> ProductOrd (a1, a2) #

(Ord a1, Ord a2, Ord a3) => Ord (ProductOrd (a1, a2, a3)) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Methods

compare :: ProductOrd (a1, a2, a3) -> ProductOrd (a1, a2, a3) -> Ordering #

(<) :: ProductOrd (a1, a2, a3) -> ProductOrd (a1, a2, a3) -> Bool #

(<=) :: ProductOrd (a1, a2, a3) -> ProductOrd (a1, a2, a3) -> Bool #

(>) :: ProductOrd (a1, a2, a3) -> ProductOrd (a1, a2, a3) -> Bool #

(>=) :: ProductOrd (a1, a2, a3) -> ProductOrd (a1, a2, a3) -> Bool #

max :: ProductOrd (a1, a2, a3) -> ProductOrd (a1, a2, a3) -> ProductOrd (a1, a2, a3) #

min :: ProductOrd (a1, a2, a3) -> ProductOrd (a1, a2, a3) -> ProductOrd (a1, a2, a3) #

(Ord a1, Ord a2, Ord a3, Ord a4) => Ord (ProductOrd (a1, a2, a3, a4)) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Methods

compare :: ProductOrd (a1, a2, a3, a4) -> ProductOrd (a1, a2, a3, a4) -> Ordering #

(<) :: ProductOrd (a1, a2, a3, a4) -> ProductOrd (a1, a2, a3, a4) -> Bool #

(<=) :: ProductOrd (a1, a2, a3, a4) -> ProductOrd (a1, a2, a3, a4) -> Bool #

(>) :: ProductOrd (a1, a2, a3, a4) -> ProductOrd (a1, a2, a3, a4) -> Bool #

(>=) :: ProductOrd (a1, a2, a3, a4) -> ProductOrd (a1, a2, a3, a4) -> Bool #

max :: ProductOrd (a1, a2, a3, a4) -> ProductOrd (a1, a2, a3, a4) -> ProductOrd (a1, a2, a3, a4) #

min :: ProductOrd (a1, a2, a3, a4) -> ProductOrd (a1, a2, a3, a4) -> ProductOrd (a1, a2, a3, a4) #

(Ord a1, Ord a2, Ord a3, Ord a4, Ord a5) => Ord (ProductOrd (a1, a2, a3, a4, a5)) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Methods

compare :: ProductOrd (a1, a2, a3, a4, a5) -> ProductOrd (a1, a2, a3, a4, a5) -> Ordering #

(<) :: ProductOrd (a1, a2, a3, a4, a5) -> ProductOrd (a1, a2, a3, a4, a5) -> Bool #

(<=) :: ProductOrd (a1, a2, a3, a4, a5) -> ProductOrd (a1, a2, a3, a4, a5) -> Bool #

(>) :: ProductOrd (a1, a2, a3, a4, a5) -> ProductOrd (a1, a2, a3, a4, a5) -> Bool #

(>=) :: ProductOrd (a1, a2, a3, a4, a5) -> ProductOrd (a1, a2, a3, a4, a5) -> Bool #

max :: ProductOrd (a1, a2, a3, a4, a5) -> ProductOrd (a1, a2, a3, a4, a5) -> ProductOrd (a1, a2, a3, a4, a5) #

min :: ProductOrd (a1, a2, a3, a4, a5) -> ProductOrd (a1, a2, a3, a4, a5) -> ProductOrd (a1, a2, a3, a4, a5) #

(Ord a1, Ord a2, Ord a3, Ord a4, Ord a5, Ord a6) => Ord (ProductOrd (a1, a2, a3, a4, a5, a6)) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Methods

compare :: ProductOrd (a1, a2, a3, a4, a5, a6) -> ProductOrd (a1, a2, a3, a4, a5, a6) -> Ordering #

(<) :: ProductOrd (a1, a2, a3, a4, a5, a6) -> ProductOrd (a1, a2, a3, a4, a5, a6) -> Bool #

(<=) :: ProductOrd (a1, a2, a3, a4, a5, a6) -> ProductOrd (a1, a2, a3, a4, a5, a6) -> Bool #

(>) :: ProductOrd (a1, a2, a3, a4, a5, a6) -> ProductOrd (a1, a2, a3, a4, a5, a6) -> Bool #

(>=) :: ProductOrd (a1, a2, a3, a4, a5, a6) -> ProductOrd (a1, a2, a3, a4, a5, a6) -> Bool #

max :: ProductOrd (a1, a2, a3, a4, a5, a6) -> ProductOrd (a1, a2, a3, a4, a5, a6) -> ProductOrd (a1, a2, a3, a4, a5, a6) #

min :: ProductOrd (a1, a2, a3, a4, a5, a6) -> ProductOrd (a1, a2, a3, a4, a5, a6) -> ProductOrd (a1, a2, a3, a4, a5, a6) #

(Ord a1, Ord a2, Ord a3, Ord a4, Ord a5, Ord a6, Ord a7) => Ord (ProductOrd (a1, a2, a3, a4, a5, a6, a7)) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Methods

compare :: ProductOrd (a1, a2, a3, a4, a5, a6, a7) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7) -> Ordering #

(<) :: ProductOrd (a1, a2, a3, a4, a5, a6, a7) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7) -> Bool #

(<=) :: ProductOrd (a1, a2, a3, a4, a5, a6, a7) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7) -> Bool #

(>) :: ProductOrd (a1, a2, a3, a4, a5, a6, a7) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7) -> Bool #

(>=) :: ProductOrd (a1, a2, a3, a4, a5, a6, a7) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7) -> Bool #

max :: ProductOrd (a1, a2, a3, a4, a5, a6, a7) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7) #

min :: ProductOrd (a1, a2, a3, a4, a5, a6, a7) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7) #

(Ord a1, Ord a2, Ord a3, Ord a4, Ord a5, Ord a6, Ord a7, Ord a8) => Ord (ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8)) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Methods

compare :: ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8) -> Ordering #

(<) :: ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8) -> Bool #

(<=) :: ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8) -> Bool #

(>) :: ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8) -> Bool #

(>=) :: ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8) -> Bool #

max :: ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8) #

min :: ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8) #

(Ord a1, Ord a2, Ord a3, Ord a4, Ord a5, Ord a6, Ord a7, Ord a8, Ord a9) => Ord (ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8, a9)) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Methods

compare :: ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8, a9) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8, a9) -> Ordering #

(<) :: ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8, a9) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8, a9) -> Bool #

(<=) :: ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8, a9) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8, a9) -> Bool #

(>) :: ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8, a9) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8, a9) -> Bool #

(>=) :: ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8, a9) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8, a9) -> Bool #

max :: ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8, a9) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8, a9) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8, a9) #

min :: ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8, a9) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8, a9) -> ProductOrd (a1, a2, a3, a4, a5, a6, a7, a8, a9) #

All Ord (Map f xs) => Ord (ProductOrd (TypedList f xs)) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Ord (ProductOrd (DFBackend t ds)) => Ord (ProductOrd (DataFrame t ds)) Source # 
Instance details

Defined in Numeric.DataFrame.Type

Read a => Read (ProductOrd a) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

(Ord (ProductOrd a), Real a) => Real (ProductOrd a) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

(Ord (ProductOrd a), RealFloat a) => RealFloat (ProductOrd a) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

(Ord (ProductOrd a), RealFrac a) => RealFrac (ProductOrd a) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Methods

properFraction :: Integral b => ProductOrd a -> (b, ProductOrd a) #

truncate :: Integral b => ProductOrd a -> b #

round :: Integral b => ProductOrd a -> b #

ceiling :: Integral b => ProductOrd a -> b #

floor :: Integral b => ProductOrd a -> b #

Show a => Show (ProductOrd a) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Generic (ProductOrd a) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Associated Types

type Rep (ProductOrd a) :: Type -> Type #

Methods

from :: ProductOrd a -> Rep (ProductOrd a) x #

to :: Rep (ProductOrd a) x -> ProductOrd a #

Semigroup a => Semigroup (ProductOrd a) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Monoid a => Monoid (ProductOrd a) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Storable a => Storable (ProductOrd a) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Methods

sizeOf :: ProductOrd a -> Int #

alignment :: ProductOrd a -> Int #

peekElemOff :: Ptr (ProductOrd a) -> Int -> IO (ProductOrd a) #

pokeElemOff :: Ptr (ProductOrd a) -> Int -> ProductOrd a -> IO () #

peekByteOff :: Ptr b -> Int -> IO (ProductOrd a) #

pokeByteOff :: Ptr b -> Int -> ProductOrd a -> IO () #

peek :: Ptr (ProductOrd a) -> IO (ProductOrd a) #

poke :: Ptr (ProductOrd a) -> ProductOrd a -> IO () #

(Ord (ProductOrd a), Bits a) => Bits (ProductOrd a) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

(Ord (ProductOrd a), FiniteBits a) => FiniteBits (ProductOrd a) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Generic1 ProductOrd Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

Associated Types

type Rep1 ProductOrd :: k -> Type #

type Rep (ProductOrd a) Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

type Rep (ProductOrd a) = D1 (MetaData "ProductOrd" "Numeric.ProductOrd.NonTransitive" "easytensor-2.0.0.0-3CCWptMCWbp7hugtqFBBKp" True) (C1 (MetaCons "ProductOrd" PrefixI True) (S1 (MetaSel (Just "getProductOrd") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 a)))
type Rep1 ProductOrd Source # 
Instance details

Defined in Numeric.ProductOrd.NonTransitive

type Rep1 ProductOrd = D1 (MetaData "ProductOrd" "Numeric.ProductOrd.NonTransitive" "easytensor-2.0.0.0-3CCWptMCWbp7hugtqFBBKp" True) (C1 (MetaCons "ProductOrd" PrefixI True) (S1 (MetaSel (Just "getProductOrd") NoSourceUnpackedness NoSourceStrictness DecidedLazy) Par1))

toOrdering :: PartialOrdering -> Ordering Source #

Treat Incomparable as EQ (non-transitive equality).