Basement.Nat

basement-0.0.16: Foundation scrap box of array & string

Safe Haskell | None
Language | Haskell2010

Basement.Nat

Contents

- Nat convertion
- Maximum bounds
- Constraint

Synopsis

- type Nat = Natural
- class KnownNat (n :: Nat)
- natVal :: forall (n :: Nat) proxy. KnownNat n => proxy n -> Integer
- 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 CmpNat (a :: Natural) (b :: Natural) :: Ordering where ...
- natValNatural :: forall (n :: Nat) proxy. KnownNat n => proxy n -> Natural
- natValInt :: forall (n :: Nat) proxy. (KnownNat n, NatWithinBound Int n) => proxy n -> Int
- natValInt8 :: forall (n :: Nat) proxy. (KnownNat n, NatWithinBound Int8 n) => proxy n -> Int8
- natValInt16 :: forall (n :: Nat) proxy. (KnownNat n, NatWithinBound Int16 n) => proxy n -> Int16
- natValInt32 :: forall (n :: Nat) proxy. (KnownNat n, NatWithinBound Int32 n) => proxy n -> Int32
- natValInt64 :: forall (n :: Nat) proxy. (KnownNat n, NatWithinBound Int64 n) => proxy n -> Int64
- natValWord :: forall (n :: Nat) proxy. (KnownNat n, NatWithinBound Word n) => proxy n -> Word
- natValWord8 :: forall (n :: Nat) proxy. (KnownNat n, NatWithinBound Word8 n) => proxy n -> Word8
- natValWord16 :: forall (n :: Nat) proxy. (KnownNat n, NatWithinBound Word16 n) => proxy n -> Word16
- natValWord32 :: forall (n :: Nat) proxy. (KnownNat n, NatWithinBound Word32 n) => proxy n -> Word32
- natValWord64 :: forall (n :: Nat) proxy. (KnownNat n, NatWithinBound Word64 n) => proxy n -> Word64
- type family NatNumMaxBound ty :: Nat
- type family NatInBoundOf ty (n :: Nat) :: Bool where ...
- type family NatWithinBound ty (n :: Nat) where ...

# Documentation

type Nat = Natural #

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

class KnownNat (n :: Nat) #

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

Minimal complete definition

natSing

natVal :: forall (n :: Nat) proxy. KnownNat n => proxy n -> Integer #

@since base-4.7.0.0

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 CmpNat (a :: Natural) (b :: Natural) :: Ordering where ... #

Comparison of type-level naturals, as a function.

@since base-4.7.0.0

# Nat convertion

natValNatural :: forall (n :: Nat) proxy. KnownNat n => proxy n -> Natural #

natValInt :: forall (n :: Nat) proxy. (KnownNat n, NatWithinBound Int n) => proxy n -> Int #

natValInt8 :: forall (n :: Nat) proxy. (KnownNat n, NatWithinBound Int8 n) => proxy n -> Int8 #

natValInt16 :: forall (n :: Nat) proxy. (KnownNat n, NatWithinBound Int16 n) => proxy n -> Int16 #

natValInt32 :: forall (n :: Nat) proxy. (KnownNat n, NatWithinBound Int32 n) => proxy n -> Int32 #

natValInt64 :: forall (n :: Nat) proxy. (KnownNat n, NatWithinBound Int64 n) => proxy n -> Int64 #

natValWord :: forall (n :: Nat) proxy. (KnownNat n, NatWithinBound Word n) => proxy n -> Word #

natValWord8 :: forall (n :: Nat) proxy. (KnownNat n, NatWithinBound Word8 n) => proxy n -> Word8 #

natValWord16 :: forall (n :: Nat) proxy. (KnownNat n, NatWithinBound Word16 n) => proxy n -> Word16 #

natValWord32 :: forall (n :: Nat) proxy. (KnownNat n, NatWithinBound Word32 n) => proxy n -> Word32 #

natValWord64 :: forall (n :: Nat) proxy. (KnownNat n, NatWithinBound Word64 n) => proxy n -> Word64 #

# Maximum bounds

type family NatNumMaxBound ty :: Nat #

Get Maximum bounds of different Integral / Natural types related to Nat

#### Instances

Instances details

type NatNumMaxBound Char7 # |
Instance details Defined in Basement.Nat type NatNumMaxBound Char7 = 127
type NatNumMaxBound Word128 # |
Instance details Defined in Basement.Nat type NatNumMaxBound Word128 = 340282366920938463463374607431768211455
type NatNumMaxBound Word256 # |
Instance details Defined in Basement.Nat type NatNumMaxBound Word256 = 115792089237316195423570985008687907853269984665640564039457584007913129639935
type NatNumMaxBound Int16 # |
Instance details Defined in Basement.Nat type NatNumMaxBound Int16 = 32767
type NatNumMaxBound Int32 # |
Instance details Defined in Basement.Nat type NatNumMaxBound Int32 = 2147483647
type NatNumMaxBound Int64 # |
Instance details Defined in Basement.Nat type NatNumMaxBound Int64 = 9223372036854775807
type NatNumMaxBound Int8 # |
Instance details Defined in Basement.Nat type NatNumMaxBound Int8 = 127
type NatNumMaxBound Word16 # |
Instance details Defined in Basement.Nat type NatNumMaxBound Word16 = 65535
type NatNumMaxBound Word32 # |
Instance details Defined in Basement.Nat type NatNumMaxBound Word32 = 4294967295
type NatNumMaxBound Word64 # |
Instance details Defined in Basement.Nat type NatNumMaxBound Word64 = 18446744073709551615
type NatNumMaxBound Word8 # |
Instance details Defined in Basement.Nat type NatNumMaxBound Word8 = 255
type NatNumMaxBound Char # |
Instance details Defined in Basement.Nat type NatNumMaxBound Char = 1114111
type NatNumMaxBound Int # |
Instance details Defined in Basement.Nat type NatNumMaxBound Int = NatNumMaxBound Int64
type NatNumMaxBound Word # |
Instance details Defined in Basement.Nat type NatNumMaxBound Word = NatNumMaxBound Word64
type NatNumMaxBound (Zn n) # |
Instance details Defined in Basement.Bounded type NatNumMaxBound (Zn n) = n
type NatNumMaxBound (Zn64 n) # |
Instance details Defined in Basement.Bounded type NatNumMaxBound (Zn64 n) = n
type NatNumMaxBound (CountOf x) # |
Instance details Defined in Basement.Types.OffsetSize type NatNumMaxBound (CountOf x) = NatNumMaxBound Int
type NatNumMaxBound (Offset x) # |
Instance details Defined in Basement.Types.OffsetSize type NatNumMaxBound (Offset x) = NatNumMaxBound Int

# Constraint

type family NatInBoundOf ty (n :: Nat) :: Bool where ... #

Check if a Nat is in bounds of another integral / natural types

Equations

NatInBoundOf Integer n = 'True |
NatInBoundOf Natural n = 'True |
NatInBoundOf ty n = n <=? NatNumMaxBound ty |

type family NatWithinBound ty (n :: Nat) where ... #

Constraint to check if a natural is within a specific bounds of a type.

i.e. given a Nat `n`, is it possible to convert it to `ty` without losing information

Equations

NatWithinBound ty n = If (NatInBoundOf ty n) (() ~ ()) (TypeError ((('Text "Natural " ':<>: 'ShowType n) ':<>: 'Text " is out of bounds for ") ':<>: 'ShowType ty) :: Constraint) |