Safe Haskell  Trustworthy 

Language  Haskell2010 
This module is an internal GHC module. It declares the constants used in the implementation of typelevel natural numbers. The programmer interface for working with typelevel naturals should be defined in a separate library.
Since: 4.6.0.0
Synopsis
 data Nat
 data Symbol
 class KnownNat (n :: Nat)
 natVal :: forall n proxy. KnownNat n => proxy n > Integer
 natVal' :: forall n. KnownNat n => Proxy# n > Integer
 class KnownSymbol (n :: Symbol)
 symbolVal :: forall n proxy. KnownSymbol n => proxy n > String
 symbolVal' :: forall n. KnownSymbol n => Proxy# n > String
 data SomeNat = KnownNat n => SomeNat (Proxy n)
 data SomeSymbol = KnownSymbol n => SomeSymbol (Proxy n)
 someNatVal :: Integer > Maybe SomeNat
 someSymbolVal :: String > SomeSymbol
 sameNat :: (KnownNat a, KnownNat b) => Proxy a > Proxy b > Maybe (a :~: b)
 sameSymbol :: (KnownSymbol a, KnownSymbol b) => Proxy a > Proxy b > Maybe (a :~: b)
 type (<=) x y = (x <=? y) ~ True
 type family (m :: Nat) <=? (n :: Nat) :: Bool
 type family (m :: Nat) + (n :: Nat) :: Nat
 type family (m :: Nat) * (n :: Nat) :: Nat
 type family (m :: Nat) ^ (n :: Nat) :: Nat
 type family (m :: Nat)  (n :: Nat) :: Nat
 type family Div (m :: Nat) (n :: Nat) :: Nat
 type family Mod (m :: Nat) (n :: Nat) :: Nat
 type family Log2 (m :: Nat) :: Nat
 type family AppendSymbol (m :: Symbol) (n :: Symbol) :: Symbol
 type family CmpNat (m :: Nat) (n :: Nat) :: Ordering
 type family CmpSymbol (m :: Symbol) (n :: Symbol) :: Ordering
 type family TypeError (a :: ErrorMessage) :: b where ...
 data ErrorMessage
Kinds
(Kind) This is the kind of typelevel symbols. Declared here because class IP needs it
Linking type and value level
class KnownNat (n :: Nat) Source #
This class gives the integer associated with a typelevel natural. There are instances of the class for every concrete literal: 0, 1, 2, etc.
Since: 4.7.0.0
natSing
class KnownSymbol (n :: Symbol) Source #
This class gives the string associated with a typelevel symbol. There are instances of the class for every concrete literal: "hello", etc.
Since: 4.7.0.0
symbolSing
symbolVal :: forall n proxy. KnownSymbol n => proxy n > String Source #
Since: 4.7.0.0
symbolVal' :: forall n. KnownSymbol n => Proxy# n > String Source #
Since: 4.8.0.0
This type represents unknown typelevel natural numbers.
Since: 4.10.0.0
Instances
Eq SomeNat Source #  Since: 4.7.0.0 
Ord SomeNat Source #  Since: 4.7.0.0 
Read SomeNat Source #  Since: 4.7.0.0 
Show SomeNat Source #  Since: 4.7.0.0 
data SomeSymbol Source #
This type represents unknown typelevel symbols.
KnownSymbol n => SomeSymbol (Proxy n)  Since: 4.7.0.0 
Instances
Eq SomeSymbol Source #  Since: 4.7.0.0 
(==) :: SomeSymbol > SomeSymbol > Bool Source # (/=) :: SomeSymbol > SomeSymbol > Bool Source #  
Ord SomeSymbol Source #  Since: 4.7.0.0 
compare :: SomeSymbol > SomeSymbol > Ordering Source # (<) :: SomeSymbol > SomeSymbol > Bool Source # (<=) :: SomeSymbol > SomeSymbol > Bool Source # (>) :: SomeSymbol > SomeSymbol > Bool Source # (>=) :: SomeSymbol > SomeSymbol > Bool Source # max :: SomeSymbol > SomeSymbol > SomeSymbol Source # min :: SomeSymbol > SomeSymbol > SomeSymbol Source #  
Read SomeSymbol Source #  Since: 4.7.0.0 
Show SomeSymbol Source #  Since: 4.7.0.0 
someNatVal :: Integer > Maybe SomeNat Source #
Convert an integer into an unknown typelevel natural.
Since: 4.7.0.0
someSymbolVal :: String > SomeSymbol Source #
Convert a string into an unknown typelevel symbol.
Since: 4.7.0.0
sameNat :: (KnownNat a, KnownNat b) => Proxy a > Proxy b > Maybe (a :~: b) Source #
We either get evidence that this function was instantiated with the
same typelevel numbers, or Nothing
.
Since: 4.7.0.0
sameSymbol :: (KnownSymbol a, KnownSymbol b) => Proxy a > Proxy b > Maybe (a :~: b) Source #
We either get evidence that this function was instantiated with the
same typelevel symbols, or Nothing
.
Since: 4.7.0.0
Functions on type literals
type (<=) x y = (x <=? y) ~ True infix 4 Source #
Comparison of typelevel naturals, as a constraint.
Since: 4.7.0.0
type family (m :: Nat) <=? (n :: Nat) :: Bool infix 4 Source #
Comparison of typelevel naturals, as a function.
NOTE: The functionality for this function should be subsumed
by CmpNat
, so this might go away in the future.
Please let us know, if you encounter discrepancies between the two.
type family (m :: Nat) + (n :: Nat) :: Nat infixl 6 Source #
Addition of typelevel naturals.
Since: 4.7.0.0
type family (m :: Nat) * (n :: Nat) :: Nat infixl 7 Source #
Multiplication of typelevel naturals.
Since: 4.7.0.0
type family (m :: Nat) ^ (n :: Nat) :: Nat infixr 8 Source #
Exponentiation of typelevel naturals.
Since: 4.7.0.0
type family (m :: Nat)  (n :: Nat) :: Nat infixl 6 Source #
Subtraction of typelevel naturals.
Since: 4.7.0.0
type family Div (m :: Nat) (n :: Nat) :: Nat infixl 7 Source #
Division (round down) of natural numbers.
Div x 0
is undefined (i.e., it cannot be reduced).
Since: 4.11.0.0
type family Mod (m :: Nat) (n :: Nat) :: Nat infixl 7 Source #
Modulus of natural numbers.
Mod x 0
is undefined (i.e., it cannot be reduced).
Since: 4.11.0.0
type family Log2 (m :: Nat) :: Nat Source #
Log base 2 (round down) of natural numbers.
Log 0
is undefined (i.e., it cannot be reduced).
Since: 4.11.0.0
type family AppendSymbol (m :: Symbol) (n :: Symbol) :: Symbol Source #
Concatenation of typelevel symbols.
Since: 4.10.0.0
type family CmpNat (m :: Nat) (n :: Nat) :: Ordering Source #
Comparison of typelevel naturals, as a function.
Since: 4.7.0.0
type family CmpSymbol (m :: Symbol) (n :: Symbol) :: Ordering Source #
Comparison of typelevel symbols, as a function.
Since: 4.7.0.0
Userdefined type errors
type family TypeError (a :: ErrorMessage) :: b where ... Source #
The typelevel equivalent of error
.
The polymorphic kind of this type allows it to be used in several settings. For instance, it can be used as a constraint, e.g. to provide a better error message for a nonexistent instance,
 in a context
instance TypeError (Text "Cannot Show
functions." :$$:
Text "Perhaps there is a missing argument?")
=> Show (a > b) where
showsPrec = error "unreachable"
It can also be placed on the righthand side of a typelevel function to provide an error for an invalid case,
type family ByteSize x where ByteSize Word16 = 2 ByteSize Word8 = 1 ByteSize a = TypeError (Text "The type " :<>: ShowType a :<>: Text " is not exportable.")
Since: 4.9.0.0
data ErrorMessage Source #
A description of a custom type error.
Text Symbol  Show the text as is. 
ShowType t  Pretty print the type.

ErrorMessage :<>: ErrorMessage infixl 6  Put two pieces of error message next to each other. 
ErrorMessage :$$: ErrorMessage infixl 5  Stack two pieces of error message on top of each other. 