fin-0.1.1: Nat and Fin: peano naturals and finite numbers
Safe Haskell None
Language Haskell2010

Data.Type.Nat

Description

Nat numbers. DataKinds stuff.

This module re-exports Data.Nat , and adds type-level things.

Synopsis

Natural, Nat numbers

data Nat Source #

Nat natural numbers.

Better than GHC's built-in Nat for some use cases.

Constructors

Z
S Nat

Instances

Instances details
Enum Nat Source #
Instance details

Defined in Data.Nat

Eq Nat Source #
Instance details

Defined in Data.Nat

Integral Nat Source #
Instance details

Defined in Data.Nat

Data Nat Source #
Instance details

Defined in Data.Nat

Methods

gfoldl :: ( forall d b. Data d => c (d -> b) -> d -> c b) -> ( forall g. g -> c g) -> Nat -> c Nat Source #

gunfold :: ( forall b r. Data b => c (b -> r) -> c r) -> ( forall r. r -> c r) -> Constr -> c Nat Source #

toConstr :: Nat -> Constr Source #

dataTypeOf :: Nat -> DataType Source #

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

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

gmapT :: ( forall b. Data b => b -> b) -> Nat -> Nat Source #

gmapQl :: (r -> r' -> r) -> r -> ( forall d. Data d => d -> r') -> Nat -> r Source #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> ( forall d. Data d => d -> r') -> Nat -> r Source #

gmapQ :: ( forall d. Data d => d -> u) -> Nat -> [u] Source #

gmapQi :: Int -> ( forall d. Data d => d -> u) -> Nat -> u Source #

gmapM :: Monad m => ( forall d. Data d => d -> m d) -> Nat -> m Nat Source #

gmapMp :: MonadPlus m => ( forall d. Data d => d -> m d) -> Nat -> m Nat Source #

gmapMo :: MonadPlus m => ( forall d. Data d => d -> m d) -> Nat -> m Nat Source #

Num Nat Source #
Instance details

Defined in Data.Nat

Ord Nat Source #
Instance details

Defined in Data.Nat

Real Nat Source #
Instance details

Defined in Data.Nat

Show Nat Source #

Nat is printed as Natural .

To see explicit structure, use explicitShow or explicitShowsPrec

Instance details

Defined in Data.Nat

Function Nat Source #
Instance details

Defined in Data.Nat

Arbitrary Nat Source #
Instance details

Defined in Data.Nat

CoArbitrary Nat Source #
Instance details

Defined in Data.Nat

NFData Nat Source #
Instance details

Defined in Data.Nat

Methods

rnf :: Nat -> () Source #

Hashable Nat Source #
Instance details

Defined in Data.Nat

TestEquality SNat Source #
Instance details

Defined in Data.Type.Nat

Methods

testEquality :: forall (a :: k) (b :: k). SNat a -> SNat b -> Maybe (a :~: b) Source #

toNatural :: Nat -> Natural Source #

Convert Nat to Natural

>>> toNatural 0
0
>>> toNatural 2
2
>>> toNatural $ S $ S $ Z
2

fromNatural :: Natural -> Nat Source #

Convert Natural to Nat

>>> fromNatural 4
4
>>> explicitShow (fromNatural 4)
"S (S (S (S Z)))"

cata :: a -> (a -> a) -> Nat -> a Source #

Fold Nat .

>>> cata [] ('x' :) 2
"xx"

Showing

explicitShow :: Nat -> String Source #

show displaying a structure of Nat .

>>> explicitShow 0
"Z"
>>> explicitShow 2
"S (S Z)"

Singleton

data SNat (n :: Nat ) where Source #

Singleton of Nat .

Constructors

SZ :: SNat ' Z
SS :: SNatI n => SNat (' S n)

snatToNat :: forall n. SNat n -> Nat Source #

Convert SNat to Nat .

>>> snatToNat (snat :: SNat Nat1)
1

snatToNatural :: forall n. SNat n -> Natural Source #

Convert SNat to Natural

>>> snatToNatural (snat :: SNat Nat0)
0
>>> snatToNatural (snat :: SNat Nat2)
2

Implicit

class SNatI (n :: Nat ) where Source #

Convenience class to get SNat .

Instances

Instances details
SNatI ' Z Source #
Instance details

Defined in Data.Type.Nat

SNatI n => SNatI (' S n) Source #
Instance details

Defined in Data.Type.Nat

withSNat :: SNat n -> ( SNatI n => r) -> r Source #

Constructor SNatI dictionary from SNat .

Since: 0.0.3

reify :: forall r. Nat -> ( forall n. SNatI n => Proxy n -> r) -> r Source #

Reify Nat .

>>> reify nat3 reflect
3

reflect :: forall n proxy. SNatI n => proxy n -> Nat Source #

Reflect type-level Nat to the term level.

reflectToNum :: forall n m proxy. ( SNatI n, Num m) => proxy n -> m Source #

As reflect but with any Num .

Equality

eqNat :: forall n m. ( SNatI n, SNatI m) => Maybe (n :~: m) Source #

Decide equality of type-level numbers.

>>> eqNat :: Maybe (Nat3 :~: Plus Nat1 Nat2)
Just Refl
>>> eqNat :: Maybe (Nat3 :~: Mult Nat2 Nat2)
Nothing

type family EqNat (n :: Nat ) (m :: Nat ) where ... Source #

Type family used to implement == from Data.Type.Equality module.

discreteNat :: forall n m. ( SNatI n, SNatI m) => Dec (n :~: m) Source #

Decide equality of type-level numbers.

>>> decShow (discreteNat :: Dec (Nat3 :~: Plus Nat1 Nat2))
"Yes Refl"

Since: 0.0.3

Induction

induction Source #

Arguments

:: forall n f. SNatI n
=> f ' Z

zero case

-> ( forall m. SNatI m => f m -> f (' S m))

induction step

-> f n

Induction on Nat .

Useful in proofs or with GADTs, see source of proofPlusNZero .

induction1 Source #

Arguments

:: forall n f a. SNatI n
=> f ' Z a

zero case

-> ( forall m. SNatI m => f m a -> f (' S m) a)

induction step

-> f n a

Induction on Nat , functor form. Useful for computation.

>>> induction1 (Tagged 0) $ retagMap (+2) :: Tagged Nat3 Int
Tagged 6

class SNatI n => InlineInduction (n :: Nat ) where Source #

The induction will be fully inlined.

See test/Inspection.hs .

Methods

inlineInduction1 :: f ' Z a -> ( forall m. InlineInduction m => f m a -> f (' S m) a) -> f n a Source #

Instances

Instances details
InlineInduction ' Z Source #
Instance details

Defined in Data.Type.Nat

Methods

inlineInduction1 :: f ' Z a -> ( forall (m :: Nat ). InlineInduction m => f m a -> f (' S m) a) -> f ' Z a Source #

InlineInduction n => InlineInduction (' S n) Source #
Instance details

Defined in Data.Type.Nat

Methods

inlineInduction1 :: f ' Z a -> ( forall (m :: Nat ). InlineInduction m => f m a -> f (' S m) a) -> f (' S n) a Source #

inlineInduction Source #

Arguments

:: forall n f. InlineInduction n
=> f ' Z

zero case

-> ( forall m. InlineInduction m => f m -> f (' S m))

induction step

-> f n

Example: unfoldedFix

unfoldedFix :: forall n a proxy. InlineInduction n => proxy n -> (a -> a) -> a Source #

Unfold n steps of a general recursion.

Note: Always benchmark . This function may give you both bad properties: a lot of code (increased binary size), and worse performance.

For known n unfoldedFix will unfold recursion, for example

unfoldedFix (Proxy :: Proxy Nat3) f = f (f (f (fix f)))

Arithmetic

type family Plus (n :: Nat ) (m :: Nat ) :: Nat where ... Source #

Addition.

>>> reflect (snat :: SNat (Plus Nat1 Nat2))
3

Equations

Plus ' Z m = m
Plus (' S n) m = ' S ( Plus n m)

type family Mult (n :: Nat ) (m :: Nat ) :: Nat where ... Source #

Multiplication.

>>> reflect (snat :: SNat (Mult Nat2 Nat3))
6

Equations

Mult ' Z m = ' Z
Mult (' S n) m = Plus m ( Mult n m)

type family Mult2 (n :: Nat ) :: Nat where ... Source #

Multiplication by two. Doubling.

>>> reflect (snat :: SNat (Mult2 Nat4))
8

Equations

Mult2 ' Z = ' Z
Mult2 (' S n) = ' S (' S ( Mult2 n))

type family DivMod2 (n :: Nat ) :: ( Nat , Bool ) where ... Source #

Division by two. False is 0 and True is 1 as a remainder.

>>> :kind! DivMod2 Nat7
DivMod2 Nat7 :: (Nat, Bool)
= '( 'S ('S ('S 'Z)), 'True)
>>> :kind! DivMod2 Nat4
DivMod2 Nat4 :: (Nat, Bool)
= '( 'S ('S 'Z), 'False)

Equations

DivMod2 ' Z = '(' Z , ' False )
DivMod2 (' S ' Z ) = '(' Z , ' True )
DivMod2 (' S (' S n)) = DivMod2' ( DivMod2 n)

Conversion to GHC Nat

type family ToGHC (n :: Nat ) :: Nat where ... Source #

Convert to GHC Nat .

>>> :kind! ToGHC Nat5
ToGHC Nat5 :: GHC.Nat
= 5

Equations

ToGHC ' Z = 0
ToGHC (' S n) = 1 + ToGHC n

type family FromGHC (n :: Nat ) :: Nat where ... Source #

Convert from GHC Nat .

>>> :kind! FromGHC 7
FromGHC 7 :: Nat
= 'S ('S ('S ('S ('S ('S ('S 'Z))))))

Equations

FromGHC 0 = ' Z
FromGHC n = ' S ( FromGHC (n - 1))

Aliases

Nat

promoted Nat

Proofs

proofMultNZero :: forall n proxy. SNatI n => proxy n -> Mult n Nat0 :~: Nat0 Source #

n * 0 = 0