type-natural-1.1.0.1: Type-level natural and proofs of their properties.
Safe HaskellNone
LanguageHaskell2010

Data.Type.Ordinal

Description

Set-theoretic ordinals for built-in type-level naturals

Since 1.0.0.0

Synopsis

Data-types

data Ordinal (n :: Nat) where Source #

Set-theoretic (finite) ordinals:

n = {0, 1, ..., n-1}

So, Ordinal n has exactly n inhabitants. So especially Ordinal 'Z is isomorphic to Void.

Since 1.0.0.0

Constructors

OLt :: n < m => SNat (n :: Nat) -> Ordinal m 

Instances

Instances details
(KnownNat n, 0 < n) => Bounded (Ordinal n) Source # 
Instance details

Defined in Data.Type.Ordinal

KnownNat n => Enum (Ordinal n) Source # 
Instance details

Defined in Data.Type.Ordinal

Methods

succ :: Ordinal n -> Ordinal n #

pred :: Ordinal n -> Ordinal n #

toEnum :: Int -> Ordinal n #

fromEnum :: Ordinal n -> Int #

enumFrom :: Ordinal n -> [Ordinal n] #

enumFromThen :: Ordinal n -> Ordinal n -> [Ordinal n] #

enumFromTo :: Ordinal n -> Ordinal n -> [Ordinal n] #

enumFromThenTo :: Ordinal n -> Ordinal n -> Ordinal n -> [Ordinal n] #

Eq (Ordinal n) Source # 
Instance details

Defined in Data.Type.Ordinal

Methods

(==) :: Ordinal n -> Ordinal n -> Bool #

(/=) :: Ordinal n -> Ordinal n -> Bool #

KnownNat n => Num (Ordinal n) Source #

Class synonym for Peano numerals with ordinals.

Since 1.0.0.0

Instance details

Defined in Data.Type.Ordinal

Methods

(+) :: Ordinal n -> Ordinal n -> Ordinal n #

(-) :: Ordinal n -> Ordinal n -> Ordinal n #

(*) :: Ordinal n -> Ordinal n -> Ordinal n #

negate :: Ordinal n -> Ordinal n #

abs :: Ordinal n -> Ordinal n #

signum :: Ordinal n -> Ordinal n #

fromInteger :: Integer -> Ordinal n #

Ord (Ordinal n) Source # 
Instance details

Defined in Data.Type.Ordinal

Methods

compare :: Ordinal n -> Ordinal n -> Ordering #

(<) :: Ordinal n -> Ordinal n -> Bool #

(<=) :: Ordinal n -> Ordinal n -> Bool #

(>) :: Ordinal n -> Ordinal n -> Bool #

(>=) :: Ordinal n -> Ordinal n -> Bool #

max :: Ordinal n -> Ordinal n -> Ordinal n #

min :: Ordinal n -> Ordinal n -> Ordinal n #

KnownNat n => Show (Ordinal n) Source # 
Instance details

Defined in Data.Type.Ordinal

Methods

showsPrec :: Int -> Ordinal n -> ShowS #

show :: Ordinal n -> String #

showList :: [Ordinal n] -> ShowS #

pattern OZ :: forall (n :: Nat). 0 < n => Ordinal n Source #

Pattern synonym representing the 0-th ordinal.

Since 1.0.0.0

pattern OS :: forall (t :: Nat). KnownNat t => Ordinal t -> Ordinal (Succ t) Source #

Pattern synonym OS n represents (n+1)-th ordinal.

Since 1.0.0.0

Quasi Quoter

This section provides QuasiQuoter and general generator for ordinals. Note that, Num instance for Ordinals DOES NOT checks boundary; with od, we can use literal with boundary check. For example, with -XQuasiQuotes language extension enabled, [od| 12 |] :: Ordinal 1 doesn't typechecks and causes compile-time error, whilst 12 :: Ordinal 1 compiles but raises run-time error. So, to enforce correctness, we recommend to use these quoters instead of bare Num numerals.

od :: QuasiQuoter Source #

Quasiquoter for ordinal indexed by built-in numeral Nat.

Conversion from cardinals to ordinals.

sNatToOrd' :: m < n => SNat (n :: Nat) -> SNat m -> Ordinal n Source #

sNatToOrd' n m injects m as Ordinal n.

Since 1.0.0.0

sNatToOrd :: (KnownNat n, m < n) => SNat m -> Ordinal n Source #

sNatToOrd' with n inferred.

unsafeNaturalToOrd' :: forall proxy (n :: Nat). KnownNat n => proxy n -> Natural -> Ordinal n Source #

Since 1.0.0.0

unsafeNaturalToOrd :: forall (n :: Nat). KnownNat n => Natural -> Ordinal n Source #

Converts Naturals into 'Ordinal n'. If the given natural is greater or equal to n, raises exception.

Since 1.0.0.0

reallyUnsafeNaturalToOrd :: forall pxy (n :: Nat). KnownNat n => pxy -> Natural -> Ordinal n Source #

Warning: This function may violate type safety. Use with care!

Converts Naturals into Ordinal n, WITHOUT any boundary check. This function may easily violate type-safety. Use with care!

naturalToOrd :: forall n. KnownNat n => Natural -> Maybe (Ordinal (n :: Nat)) Source #

Since 1.0.0.0

ordToSNat :: Ordinal (n :: Nat) -> SomeSNat Source #

Convert Ordinal n into monomorphic SNat

Since 1.0.0.0

inclusion :: n <= m => Ordinal n -> Ordinal m Source #

Inclusion function for ordinals with codomain inferred.

Since 1.0.0.0(constraint was weakened since last released)

inclusion' :: n <= m => SNat m -> Ordinal n -> Ordinal m Source #

Inclusion function for ordinals.

Since 1.0.0.0(constraint was weakened since last released)

Ordinal arithmetics

(@+) :: forall (n :: Nat) m. (KnownNat n, KnownNat m) => Ordinal n -> Ordinal m -> Ordinal (n + m) Source #

Ordinal addition.

Since 1.0.0.0(type changed)

enumOrdinal :: SNat (n :: Nat) -> [Ordinal n] Source #

Enumerate all Ordinals less than n.

Elimination rules for Ordinal Z.

absurdOrd :: Ordinal 0 -> a Source #

Since Ordinal 'Z is logically not inhabited, we can coerce it to any value.

Since 1.0.0.0

vacuousOrd :: Functor f => f (Ordinal 0) -> f a Source #

absurdOrd for value in Functor.

Since 1.0.0.0