| Safe Haskell | Trustworthy |
|---|---|
| Language | Haskell2010 |
GHC.Internal.TypeLits
Description
GHC's DataKinds language extension lifts data constructors, natural
numbers, and strings to the type level. This module provides the
primitives needed for working with type-level numbers (the Nat kind),
strings (the Symbol kind), and characters (the Char kind). It also defines the TypeError type
family, a feature that makes use of type-level strings to support user
defined type errors.
For now, this module is the API for working with type-level literals.
However, please note that it is a work in progress and is subject to change.
Once the design of the DataKinds feature is more stable, this will be
considered only an internal GHC module, and the programmer interface for
working with type-level data will be defined in a separate library.
Since: base-4.6.0.0
Synopsis
- data Natural
- type Nat = Natural
- data Symbol
- class KnownNat (n :: Nat) where
- natVal :: forall (n :: Nat) proxy. KnownNat n => proxy n -> Integer
- natVal' :: forall (n :: Nat). KnownNat n => Proxy# n -> Integer
- class KnownSymbol (n :: Symbol) where
- symbolSing :: SSymbol n
- symbolVal :: forall (n :: Symbol) proxy. KnownSymbol n => proxy n -> String
- symbolVal' :: forall (n :: Symbol). KnownSymbol n => Proxy# n -> String
- class KnownChar (n :: Char) where
- charVal :: forall (n :: Char) proxy. KnownChar n => proxy n -> Char
- charVal' :: forall (n :: Char). KnownChar n => Proxy# n -> Char
- data SomeNat = KnownNat n => SomeNat (Proxy n)
- data SomeSymbol = KnownSymbol n => SomeSymbol (Proxy n)
- data SomeChar = KnownChar n => SomeChar (Proxy n)
- someNatVal :: Integer -> Maybe SomeNat
- someSymbolVal :: String -> SomeSymbol
- someCharVal :: Char -> SomeChar
- sameNat :: forall (a :: Nat) (b :: Nat) proxy1 proxy2. (KnownNat a, KnownNat b) => proxy1 a -> proxy2 b -> Maybe (a :~: b)
- sameSymbol :: forall (a :: Symbol) (b :: Symbol) proxy1 proxy2. (KnownSymbol a, KnownSymbol b) => proxy1 a -> proxy2 b -> Maybe (a :~: b)
- sameChar :: forall (a :: Char) (b :: Char) proxy1 proxy2. (KnownChar a, KnownChar b) => proxy1 a -> proxy2 b -> Maybe (a :~: b)
- decideNat :: forall (a :: Nat) (b :: Nat) proxy1 proxy2. (KnownNat a, KnownNat b) => proxy1 a -> proxy2 b -> Either ((a :~: b) -> Void) (a :~: b)
- decideSymbol :: forall (a :: Symbol) (b :: Symbol) proxy1 proxy2. (KnownSymbol a, KnownSymbol b) => proxy1 a -> proxy2 b -> Either ((a :~: b) -> Void) (a :~: b)
- decideChar :: forall (a :: Char) (b :: Char) proxy1 proxy2. (KnownChar a, KnownChar b) => proxy1 a -> proxy2 b -> Either ((a :~: b) -> Void) (a :~: b)
- data OrderingI (a :: k) (b :: k) where
- cmpNat :: forall (a :: Nat) (b :: Nat) proxy1 proxy2. (KnownNat a, KnownNat b) => proxy1 a -> proxy2 b -> OrderingI a b
- cmpSymbol :: forall (a :: Symbol) (b :: Symbol) proxy1 proxy2. (KnownSymbol a, KnownSymbol b) => proxy1 a -> proxy2 b -> OrderingI a b
- cmpChar :: forall (a :: Char) (b :: Char) proxy1 proxy2. (KnownChar a, KnownChar b) => proxy1 a -> proxy2 b -> OrderingI a b
- data SNat (n :: Nat) where
- pattern UnsafeSNat :: Natural -> SNat n
- data SSymbol (s :: Symbol) where
- pattern UnsafeSSymbol :: String -> SSymbol s
- data SChar (s :: Char) where
- pattern UnsafeSChar :: Char -> SChar c
- pattern SNat :: () => KnownNat n => SNat n
- pattern SSymbol :: () => KnownSymbol s => SSymbol s
- pattern SChar :: () => KnownChar c => SChar c
- fromSNat :: forall (n :: Nat). SNat n -> Integer
- fromSSymbol :: forall (s :: Symbol). SSymbol s -> String
- fromSChar :: forall (c :: Char). SChar c -> Char
- withSomeSNat :: Integer -> (forall (n :: Nat). Maybe (SNat n) -> r) -> r
- withSomeSSymbol :: String -> (forall (s :: Symbol). SSymbol s -> r) -> r
- withSomeSChar :: Char -> (forall (c :: Char). SChar c -> r) -> r
- withKnownNat :: forall (n :: Nat) r. SNat n -> (KnownNat n => r) -> r
- withKnownSymbol :: forall (s :: Symbol) r. SSymbol s -> (KnownSymbol s => r) -> r
- withKnownChar :: forall (c :: Char) r. SChar c -> (KnownChar c => r) -> r
- unsafeWithSNatCo :: ((forall (n :: Nat). Coercible (SNat n) Natural) => r) -> r
- unsafeWithSSymbolCo :: ((forall (s :: Symbol). Coercible (SSymbol s) String) => r) -> r
- unsafeWithSCharCo :: ((forall (c :: Char). Coercible (SChar c) Char) => r) -> r
- type (<=) (x :: t) (y :: t) = Assert (x <=? y) (LeErrMsg x y :: Constraint)
- type (<=?) (m :: k) (n :: k) = OrdCond (Compare m n) 'True 'True 'False
- type family (a :: Natural) + (b :: Natural) :: Natural where ...
- type family (a :: Natural) * (b :: Natural) :: Natural where ...
- type family (a :: Natural) ^ (b :: Natural) :: Natural where ...
- type family (a :: Natural) - (b :: Natural) :: Natural where ...
- type family Div (a :: Natural) (b :: Natural) :: Natural where ...
- type family Mod (a :: Natural) (b :: Natural) :: Natural where ...
- type family Log2 (a :: Natural) :: Natural where ...
- type family AppendSymbol (a :: Symbol) (b :: Symbol) :: Symbol where ...
- type family CmpNat (a :: Natural) (b :: Natural) :: Ordering where ...
- type family CmpSymbol (a :: Symbol) (b :: Symbol) :: Ordering where ...
- type family CmpChar (a :: Char) (b :: Char) :: Ordering where ...
- type family ConsSymbol (a :: Char) (b :: Symbol) :: Symbol where ...
- type family UnconsSymbol (a :: Symbol) :: Maybe (Char, Symbol) where ...
- type family CharToNat (a :: Char) :: Natural where ...
- type family NatToChar (a :: Natural) :: Char where ...
- type family TypeError (a :: ErrorMessage) :: b where ...
- data ErrorMessage
Kinds
Natural number
Invariant: numbers <= 0xffffffffffffffff use the NS constructor
Instances
| Bits Natural # | Since: base-4.8.0 |
Defined in GHC.Internal.Bits Methods (.&.) :: Natural -> Natural -> Natural # (.|.) :: Natural -> Natural -> Natural # xor :: Natural -> Natural -> Natural # complement :: Natural -> Natural # shift :: Natural -> Int -> Natural # rotate :: Natural -> Int -> Natural # setBit :: Natural -> Int -> Natural # clearBit :: Natural -> Int -> Natural # complementBit :: Natural -> Int -> Natural # testBit :: Natural -> Int -> Bool # bitSizeMaybe :: Natural -> Maybe Int # shiftL :: Natural -> Int -> Natural # unsafeShiftL :: Natural -> Int -> Natural # shiftR :: Natural -> Int -> Natural # unsafeShiftR :: Natural -> Int -> Natural # rotateL :: Natural -> Int -> Natural # | |
| Eq Natural # | |
| Ord Natural # | |
Defined in GHC.Internal.Bignum.Natural | |
| Data Natural # | Since: base-4.8.0.0 |
Defined in GHC.Internal.Data.Data Methods gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Natural -> c Natural # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c Natural # toConstr :: Natural -> Constr # dataTypeOf :: Natural -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c Natural) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Natural) # gmapT :: (forall b. Data b => b -> b) -> Natural -> Natural # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Natural -> r # gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Natural -> r # gmapQ :: (forall d. Data d => d -> u) -> Natural -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> Natural -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> Natural -> m Natural # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Natural -> m Natural # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Natural -> m Natural # | |
| Enum Natural # | Since: base-4.8.0.0 |
| Ix Natural # | Since: base-4.8.0.0 |
Defined in GHC.Internal.Ix | |
| Num Natural # | Note that Since: base-4.8.0.0 |
| Read Natural # | Since: base-4.8.0.0 |
| Integral Natural # | Since: base-4.8.0.0 |
Defined in GHC.Internal.Real | |
| Real Natural # | Since: base-4.8.0.0 |
Defined in GHC.Internal.Real Methods toRational :: Natural -> Rational # | |
| Show Natural # | Since: base-4.8.0.0 |
| TestCoercion SNat # | Since: base-4.18.0.0 |
Defined in GHC.Internal.TypeNats | |
| TestEquality SNat # | Since: base-4.18.0.0 |
Defined in GHC.Internal.TypeNats | |
| Lift Natural # | |
| type Compare (a :: Natural) (b :: Natural) # | |
Defined in GHC.Internal.Data.Type.Ord | |
A type synonym for Natural.
Previously, this was an opaque data type, but it was changed to a type synonym.
Since: base-4.16.0.0
(Kind) This is the kind of type-level symbols.
Instances
| TestCoercion SSymbol # | Since: base-4.18.0.0 |
Defined in GHC.Internal.TypeLits | |
| TestEquality SSymbol # | Since: base-4.18.0.0 |
Defined in GHC.Internal.TypeLits | |
| type Compare (a :: Symbol) (b :: Symbol) # | |
Defined in GHC.Internal.Data.Type.Ord | |
Linking type and value level
class KnownNat (n :: Nat) where #
This class gives the integer associated with a type-level natural. There are instances of the class for every concrete literal: 0, 1, 2, etc.
Since: base-4.7.0.0
class KnownSymbol (n :: Symbol) where #
This class gives the string associated with a type-level symbol. There are instances of the class for every concrete literal: "hello", etc.
Since: base-4.7.0.0
Methods
symbolSing :: SSymbol n #
symbolVal :: forall (n :: Symbol) proxy. KnownSymbol n => proxy n -> String #
Since: base-4.7.0.0
symbolVal' :: forall (n :: Symbol). KnownSymbol n => Proxy# n -> String #
Since: base-4.8.0.0
This type represents unknown type-level natural numbers.
Since: base-4.10.0.0
data SomeSymbol #
This type represents unknown type-level symbols.
Constructors
| KnownSymbol n => SomeSymbol (Proxy n) | Since: base-4.7.0.0 |
Instances
| Eq SomeSymbol # | Since: base-4.7.0.0 |
Defined in GHC.Internal.TypeLits | |
| Ord SomeSymbol # | Since: base-4.7.0.0 |
Defined in GHC.Internal.TypeLits Methods compare :: SomeSymbol -> SomeSymbol -> Ordering # (<) :: SomeSymbol -> SomeSymbol -> Bool # (<=) :: SomeSymbol -> SomeSymbol -> Bool # (>) :: SomeSymbol -> SomeSymbol -> Bool # (>=) :: SomeSymbol -> SomeSymbol -> Bool # max :: SomeSymbol -> SomeSymbol -> SomeSymbol # min :: SomeSymbol -> SomeSymbol -> SomeSymbol # | |
| Read SomeSymbol # | Since: base-4.7.0.0 |
Defined in GHC.Internal.TypeLits Methods readsPrec :: Int -> ReadS SomeSymbol # readList :: ReadS [SomeSymbol] # readPrec :: ReadPrec SomeSymbol # readListPrec :: ReadPrec [SomeSymbol] # | |
| Show SomeSymbol # | Since: base-4.7.0.0 |
Defined in GHC.Internal.TypeLits Methods showsPrec :: Int -> SomeSymbol -> ShowS # show :: SomeSymbol -> String # showList :: [SomeSymbol] -> ShowS # | |
someNatVal :: Integer -> Maybe SomeNat #
Convert an integer into an unknown type-level natural.
Since: base-4.7.0.0
someSymbolVal :: String -> SomeSymbol #
Convert a string into an unknown type-level symbol.
Since: base-4.7.0.0
someCharVal :: Char -> SomeChar #
Convert a character into an unknown type-level char.
Since: base-4.16.0.0
sameNat :: forall (a :: Nat) (b :: Nat) proxy1 proxy2. (KnownNat a, KnownNat b) => proxy1 a -> proxy2 b -> Maybe (a :~: b) #
We either get evidence that this function was instantiated with the
same type-level numbers, or Nothing.
Since: base-4.7.0.0
sameSymbol :: forall (a :: Symbol) (b :: Symbol) proxy1 proxy2. (KnownSymbol a, KnownSymbol b) => proxy1 a -> proxy2 b -> Maybe (a :~: b) #
We either get evidence that this function was instantiated with the
same type-level symbols, or Nothing.
Since: base-4.7.0.0
sameChar :: forall (a :: Char) (b :: Char) proxy1 proxy2. (KnownChar a, KnownChar b) => proxy1 a -> proxy2 b -> Maybe (a :~: b) #
We either get evidence that this function was instantiated with the
same type-level characters, or Nothing.
Since: base-4.16.0.0
decideNat :: forall (a :: Nat) (b :: Nat) proxy1 proxy2. (KnownNat a, KnownNat b) => proxy1 a -> proxy2 b -> Either ((a :~: b) -> Void) (a :~: b) #
We either get evidence that this function was instantiated with the same type-level numbers, or that the type-level numbers are distinct.
Since: base-4.19.0.0
decideSymbol :: forall (a :: Symbol) (b :: Symbol) proxy1 proxy2. (KnownSymbol a, KnownSymbol b) => proxy1 a -> proxy2 b -> Either ((a :~: b) -> Void) (a :~: b) #
We either get evidence that this function was instantiated with the same type-level symbols, or that the type-level symbols are distinct.
Since: base-4.19.0.0
decideChar :: forall (a :: Char) (b :: Char) proxy1 proxy2. (KnownChar a, KnownChar b) => proxy1 a -> proxy2 b -> Either ((a :~: b) -> Void) (a :~: b) #
We either get evidence that this function was instantiated with the same type-level characters, or that the type-level characters are distinct.
Since: base-4.19.0.0
data OrderingI (a :: k) (b :: k) where #
Ordering data type for type literals that provides proof of their ordering.
Since: base-4.16.0.0
Constructors
| LTI :: forall {k} (a :: k) (b :: k). Compare a b ~ 'LT => OrderingI a b | |
| EQI :: forall {k} (a :: k). Compare a a ~ 'EQ => OrderingI a a | |
| GTI :: forall {k} (a :: k) (b :: k). Compare a b ~ 'GT => OrderingI a b |
cmpNat :: forall (a :: Nat) (b :: Nat) proxy1 proxy2. (KnownNat a, KnownNat b) => proxy1 a -> proxy2 b -> OrderingI a b #
Like sameNat, but if the numbers aren't equal, this additionally
provides proof of LT or GT.
Since: base-4.16.0.0
cmpSymbol :: forall (a :: Symbol) (b :: Symbol) proxy1 proxy2. (KnownSymbol a, KnownSymbol b) => proxy1 a -> proxy2 b -> OrderingI a b #
Like sameSymbol, but if the symbols aren't equal, this additionally
provides proof of LT or GT.
Since: base-4.16.0.0
cmpChar :: forall (a :: Char) (b :: Char) proxy1 proxy2. (KnownChar a, KnownChar b) => proxy1 a -> proxy2 b -> OrderingI a b #
Like sameChar, but if the Chars aren't equal, this additionally
provides proof of LT or GT.
Since: base-4.16.0.0
Singleton values
A value-level witness for a type-level natural number. This is commonly
referred to as a singleton type, as for each n, there is a single value
that inhabits the type (aside from bottom).SNat n
The definition of SNat is intentionally left abstract. To obtain an SNat
value, use one of the following:
- The
natSingmethod ofKnownNat. - The
SNatpattern synonym. - The
withSomeSNatfunction, which creates anSNatfrom aNaturalnumber.
Since: base-4.18.0.0
Bundled Patterns
| pattern UnsafeSNat :: Natural -> SNat n | A pattern that can be used to manipulate the
When using this pattern to construct an |
Instances
| TestCoercion SNat # | Since: base-4.18.0.0 |
Defined in GHC.Internal.TypeNats | |
| TestEquality SNat # | Since: base-4.18.0.0 |
Defined in GHC.Internal.TypeNats | |
| Eq (SNat n) # | Since: base-4.19.0.0 |
| Ord (SNat n) # | Since: base-4.19.0.0 |
| Show (SNat n) # | Since: base-4.18.0.0 |
data SSymbol (s :: Symbol) where #
A value-level witness for a type-level symbol. This is commonly referred
to as a singleton type, as for each s, there is a single value that
inhabits the type (aside from bottom).SSymbol s
The definition of SSymbol is intentionally left abstract. To obtain an
SSymbol value, use one of the following:
- The
symbolSingmethod ofKnownSymbol. - The
SSymbolpattern synonym. - The
withSomeSSymbolfunction, which creates anSSymbolfrom aString.
Since: base-4.18.0.0
Bundled Patterns
| pattern UnsafeSSymbol :: String -> SSymbol s | A pattern that can be used to manipulate the
When using this pattern to construct an |
Instances
| TestCoercion SSymbol # | Since: base-4.18.0.0 |
Defined in GHC.Internal.TypeLits | |
| TestEquality SSymbol # | Since: base-4.18.0.0 |
Defined in GHC.Internal.TypeLits | |
| Eq (SSymbol s) # | Since: base-4.19.0.0 |
| Ord (SSymbol s) # | Since: base-4.19.0.0 |
| Show (SSymbol s) # | Since: base-4.18.0.0 |
data SChar (s :: Char) where #
A value-level witness for a type-level character. This is commonly referred
to as a singleton type, as for each c, there is a single value that
inhabits the type (aside from bottom).SChar c
The definition of SChar is intentionally left abstract. To obtain an
SChar value, use one of the following:
- The
charSingmethod ofKnownChar. - The
SCharpattern synonym. - The
withSomeSCharfunction, which creates anSCharfrom aChar.
Since: base-4.18.0.0
Bundled Patterns
| pattern UnsafeSChar :: Char -> SChar c | A pattern that can be used to manipulate the
When using this pattern to construct an |
Instances
| TestCoercion SChar # | Since: base-4.18.0.0 |
Defined in GHC.Internal.TypeLits | |
| TestEquality SChar # | Since: base-4.18.0.0 |
Defined in GHC.Internal.TypeLits | |
| Eq (SChar c) # | Since: base-4.19.0.0 |
| Ord (SChar c) # | Since: base-4.19.0.0 |
Defined in GHC.Internal.TypeLits | |
| Show (SChar c) # | Since: base-4.18.0.0 |
pattern SNat :: () => KnownNat n => SNat n #
A explicitly bidirectional pattern synonym relating an SNat to a
KnownNat constraint.
As an expression: Constructs an explicit value from an
implicit SNat n constraint:KnownNat n
SNat @n ::KnownNatn =>SNatn
As a pattern: Matches on an explicit value bringing
an implicit SNat n constraint into scope:KnownNat n
f :: SNat n -> ..
f SNat = {- KnownNat n in scope -}
Since: base-4.18.0.0
pattern SSymbol :: () => KnownSymbol s => SSymbol s #
A explicitly bidirectional pattern synonym relating an SSymbol to a
KnownSymbol constraint.
As an expression: Constructs an explicit value from an
implicit SSymbol s constraint:KnownSymbol s
SSymbol @s ::KnownSymbols =>SSymbols
As a pattern: Matches on an explicit value bringing
an implicit SSymbol s constraint into scope:KnownSymbol s
f :: SSymbol s -> ..
f SSymbol = {- KnownSymbol s in scope -}
Since: base-4.18.0.0
pattern SChar :: () => KnownChar c => SChar c #
A explicitly bidirectional pattern synonym relating an SChar to a
KnownChar constraint.
As an expression: Constructs an explicit value from an
implicit SChar c constraint:KnownChar c
SChar @c ::KnownCharc =>SCharc
As a pattern: Matches on an explicit value bringing
an implicit SChar c constraint into scope:KnownChar c
f :: SChar c -> ..
f SChar = {- KnownChar c in scope -}
Since: base-4.18.0.0
fromSNat :: forall (n :: Nat). SNat n -> Integer #
Return the Integer corresponding to n in an value.
The returned SNat nInteger is always non-negative.
For a version of this function that returns a Natural instead of an
Integer, see fromSNat in GHC.TypeNats.
Since: base-4.18.0.0
fromSSymbol :: forall (s :: Symbol). SSymbol s -> String #
Return the String corresponding to s in an value.SSymbol s
Since: base-4.18.0.0
withSomeSNat :: Integer -> (forall (n :: Nat). Maybe (SNat n) -> r) -> r #
Attempt to convert an Integer into an value, where SNat nn is a
fresh type-level natural number. If the Integer argument is non-negative,
invoke the continuation with Just sn, where sn is the value.
If the SNat nInteger argument is negative, invoke the continuation with
Nothing.
For a version of this function where the continuation uses 'SNat n
instead of Maybe (SNat n)@, see withSomeSNat in GHC.TypeNats.
Since: base-4.18.0.0
withSomeSSymbol :: String -> (forall (s :: Symbol). SSymbol s -> r) -> r #
withSomeSChar :: Char -> (forall (c :: Char). SChar c -> r) -> r #
withKnownNat :: forall (n :: Nat) r. SNat n -> (KnownNat n => r) -> r #
withKnownSymbol :: forall (s :: Symbol) r. SSymbol s -> (KnownSymbol s => r) -> r #
Convert an explicit value into an implicit SSymbol s
constraint.KnownSymbol s
Since: base-4.18.0.0
withKnownChar :: forall (c :: Char) r. SChar c -> (KnownChar c => r) -> r #
unsafeWithSNatCo :: ((forall (n :: Nat). Coercible (SNat n) Natural) => r) -> r #
unsafeWithSNatCo allows uses of coerce in its argument to see the
real representation of SNat n, without undermining the type-safety of
coerce elsewhere in the module.
See also the documentation for UnsafeSNat.
unsafeWithSSymbolCo :: ((forall (s :: Symbol). Coercible (SSymbol s) String) => r) -> r #
unsafeWithSSymbolCo allows uses of coerce in its argument to see the
real representation of SSymbol s, without undermining the type-safety of
coerce elsewhere in the module.
See also the documentation for UnsafeSSymbol.
unsafeWithSCharCo :: ((forall (c :: Char). Coercible (SChar c) Char) => r) -> r #
unsafeWithSCharCo allows uses of coerce in its argument to see the
real representation of SChar c, without undermining the type-safety of
coerce elsewhere in the module.
See also the documentation for UnsafeSChar.
Functions on type literals
type (<=) (x :: t) (y :: t) = Assert (x <=? y) (LeErrMsg x y :: Constraint) infix 4 #
Comparison (<=) of comparable types, as a constraint.
Since: base-4.16.0.0
type (<=?) (m :: k) (n :: k) = OrdCond (Compare m n) 'True 'True 'False infix 4 #
Comparison (<=) of comparable types, as a function.
Since: base-4.16.0.0
type family (a :: Natural) + (b :: Natural) :: Natural where ... infixl 6 #
Addition of type-level naturals.
Since: base-4.7.0.0
type family (a :: Natural) * (b :: Natural) :: Natural where ... infixl 7 #
Multiplication of type-level naturals.
Since: base-4.7.0.0
type family (a :: Natural) ^ (b :: Natural) :: Natural where ... infixr 8 #
Exponentiation of type-level naturals.
Since: base-4.7.0.0
type family (a :: Natural) - (b :: Natural) :: Natural where ... infixl 6 #
Subtraction of type-level naturals.
Since: base-4.7.0.0
type family Div (a :: Natural) (b :: Natural) :: Natural where ... infixl 7 #
Division (round down) of natural numbers.
Div x 0 is undefined (i.e., it cannot be reduced).
Since: base-4.11.0.0
type family Mod (a :: Natural) (b :: Natural) :: Natural where ... infixl 7 #
Modulus of natural numbers.
Mod x 0 is undefined (i.e., it cannot be reduced).
Since: base-4.11.0.0
type family Log2 (a :: Natural) :: Natural where ... #
Log base 2 (round down) of natural numbers.
Log 0 is undefined (i.e., it cannot be reduced).
Since: base-4.11.0.0
type family AppendSymbol (a :: Symbol) (b :: Symbol) :: Symbol where ... #
Concatenation of type-level symbols.
Since: base-4.10.0.0
type family CmpNat (a :: Natural) (b :: Natural) :: Ordering where ... #
Comparison of type-level naturals, as a function.
Since: base-4.7.0.0
type family CmpSymbol (a :: Symbol) (b :: Symbol) :: Ordering where ... #
Comparison of type-level symbols, as a function.
Since: base-4.7.0.0
type family CmpChar (a :: Char) (b :: Char) :: Ordering where ... #
Comparison of type-level characters.
Since: base-4.16.0.0
type family ConsSymbol (a :: Char) (b :: Symbol) :: Symbol where ... #
Extending a type-level symbol with a type-level character
Since: base-4.16.0.0
type family CharToNat (a :: Char) :: Natural where ... #
Convert a character to its Unicode code point (cf. ord)
Since: base-4.16.0.0
type family NatToChar (a :: Natural) :: Char where ... #
Convert a Unicode code point to a character (cf. chr)
Since: base-4.16.0.0
User-defined type errors
type family TypeError (a :: ErrorMessage) :: b where ... #
The type-level 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 non-existent 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 right-hand side of a type-level 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: base-4.9.0.0
data ErrorMessage #
A description of a custom type error.
Constructors
| 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. |