-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Type-level (low cardinality) integers. -- -- This package provides unary type level representations of the -- (positive and negative) integers and basic operations (addition, -- subtraction, multiplication, division) on these. Due to the unary -- implementation the practical size of the NumTypes is severely limited -- making them unsuitable for large-cardinality applications. If you will -- be working with integers beyond (-20, 20) this package probably isn't -- for you. It is, however, eminently suitable for applications such as -- representing physical dimensions (see the Dimensional library). @package numtype @version 1.2 -- | Please refer to the literate Haskell code for documentation of both -- API and implementation. module Numeric.NumType class (NumTypeI n) => NumType n class (PosTypeI n) => PosType n class (NegTypeI n) => NegType n class (NonZeroI n) => NonZero n class (NumTypeI a, NumTypeI b) => Succ a b | a -> b, b -> a class (NumTypeI a, NumTypeI b) => Negate a b | a -> b, b -> a class (Add a b c, Sub c b a) => Sum a b c | a b -> c, a c -> b, b c -> a class (NumTypeI a, NonZeroI b, NumTypeI c) => Div a b c | a b -> c, c b -> a class (NumTypeI a, NumTypeI b, NumTypeI c) => Mul a b c | a b -> c toNum :: (NumTypeI n, Num a) => n -> a incr :: (Succ a b) => a -> b decr :: (Succ a b) => b -> a negate :: (Negate a b) => a -> b (+) :: (Sum a b c) => a -> b -> c infixl 6 + (-) :: (Sum a b c) => c -> b -> a infixl 6 - (*) :: (Mul a b c) => a -> b -> c infixl 7 * (/) :: (Div a b c) => a -> b -> c infixl 7 / data Zero data Pos n data Neg n type Pos1 = Pos Zero type Pos2 = Pos Pos1 type Pos3 = Pos Pos2 type Pos4 = Pos Pos3 type Pos5 = Pos Pos4 type Neg1 = Neg Zero type Neg2 = Neg Neg1 type Neg3 = Neg Neg2 type Neg4 = Neg Neg3 type Neg5 = Neg Neg4 zero :: Zero pos1 :: Pos1 pos2 :: Pos2 pos3 :: Pos3 pos4 :: Pos4 pos5 :: Pos5 neg1 :: Neg1 neg2 :: Neg2 neg3 :: Neg3 neg4 :: Neg4 neg5 :: Neg5 instance Numeric.NumType.NumTypeI n => Numeric.NumType.NumType n instance Numeric.NumType.PosTypeI n => Numeric.NumType.PosType n instance Numeric.NumType.NegTypeI n => Numeric.NumType.NegType n instance Numeric.NumType.NonZeroI n => Numeric.NumType.NonZero n instance Numeric.NumType.NumTypeI Numeric.NumType.Zero instance Numeric.NumType.PosTypeI Numeric.NumType.Zero instance Numeric.NumType.NegTypeI Numeric.NumType.Zero instance Numeric.NumType.PosTypeI n => Numeric.NumType.NumTypeI (Numeric.NumType.Pos n) instance Numeric.NumType.PosTypeI n => Numeric.NumType.PosTypeI (Numeric.NumType.Pos n) instance Numeric.NumType.PosTypeI n => Numeric.NumType.NonZeroI (Numeric.NumType.Pos n) instance Numeric.NumType.NegTypeI n => Numeric.NumType.NumTypeI (Numeric.NumType.Neg n) instance Numeric.NumType.NegTypeI n => Numeric.NumType.NegTypeI (Numeric.NumType.Neg n) instance Numeric.NumType.NegTypeI n => Numeric.NumType.NonZeroI (Numeric.NumType.Neg n) instance GHC.Show.Show Numeric.NumType.Zero instance Numeric.NumType.PosTypeI n => GHC.Show.Show (Numeric.NumType.Pos n) instance Numeric.NumType.NegTypeI n => GHC.Show.Show (Numeric.NumType.Neg n) instance Numeric.NumType.Negate Numeric.NumType.Zero Numeric.NumType.Zero instance (Numeric.NumType.PosTypeI a, Numeric.NumType.NegTypeI b, Numeric.NumType.Negate a b) => Numeric.NumType.Negate (Numeric.NumType.Pos a) (Numeric.NumType.Neg b) instance (Numeric.NumType.NegTypeI a, Numeric.NumType.PosTypeI b, Numeric.NumType.Negate a b) => Numeric.NumType.Negate (Numeric.NumType.Neg a) (Numeric.NumType.Pos b) instance Numeric.NumType.Succ Numeric.NumType.Zero (Numeric.NumType.Pos Numeric.NumType.Zero) instance Numeric.NumType.PosTypeI a => Numeric.NumType.Succ (Numeric.NumType.Pos a) (Numeric.NumType.Pos (Numeric.NumType.Pos a)) instance Numeric.NumType.Succ (Numeric.NumType.Neg Numeric.NumType.Zero) Numeric.NumType.Zero instance Numeric.NumType.NegTypeI a => Numeric.NumType.Succ (Numeric.NumType.Neg (Numeric.NumType.Neg a)) (Numeric.NumType.Neg a) instance Numeric.NumType.NumTypeI a => Numeric.NumType.Add Numeric.NumType.Zero a a instance (Numeric.NumType.PosTypeI a, Numeric.NumType.Succ b c, Numeric.NumType.Add a c d) => Numeric.NumType.Add (Numeric.NumType.Pos a) b d instance (Numeric.NumType.NegTypeI a, Numeric.NumType.Succ c b, Numeric.NumType.Add a c d) => Numeric.NumType.Add (Numeric.NumType.Neg a) b d instance Numeric.NumType.NumType a => Numeric.NumType.Sub a Numeric.NumType.Zero a instance (Numeric.NumType.Succ a' a, Numeric.NumType.PosTypeI b, Numeric.NumType.Sub a' b c) => Numeric.NumType.Sub a (Numeric.NumType.Pos b) c instance (Numeric.NumType.Succ a a', Numeric.NumType.NegTypeI b, Numeric.NumType.Sub a' b c) => Numeric.NumType.Sub a (Numeric.NumType.Neg b) c instance (Numeric.NumType.Add a b c, Numeric.NumType.Sub c b a, Numeric.NumType.Sub c a b) => Numeric.NumType.Sum a b c instance Numeric.NumType.NonZeroI n => Numeric.NumType.Div Numeric.NumType.Zero n Numeric.NumType.Zero instance (Numeric.NumType.Sum n' (Numeric.NumType.Pos n'') (Numeric.NumType.Pos n), Numeric.NumType.Div n'' (Numeric.NumType.Pos n') n''', Numeric.NumType.PosTypeI n''') => Numeric.NumType.Div (Numeric.NumType.Pos n) (Numeric.NumType.Pos n') (Numeric.NumType.Pos n''') instance (Numeric.NumType.NegTypeI n, Numeric.NumType.NegTypeI n', Numeric.NumType.Negate n p, Numeric.NumType.Negate n' p', Numeric.NumType.Div (Numeric.NumType.Pos p) (Numeric.NumType.Pos p') (Numeric.NumType.Pos p''), Numeric.NumType.PosTypeI p'') => Numeric.NumType.Div (Numeric.NumType.Neg n) (Numeric.NumType.Neg n') (Numeric.NumType.Pos p'') instance (Numeric.NumType.NegTypeI n, Numeric.NumType.Negate n p', Numeric.NumType.Div (Numeric.NumType.Pos p) (Numeric.NumType.Pos p') (Numeric.NumType.Pos p''), Numeric.NumType.Negate (Numeric.NumType.Pos p'') (Numeric.NumType.Neg n''), Numeric.NumType.PosTypeI p) => Numeric.NumType.Div (Numeric.NumType.Pos p) (Numeric.NumType.Neg n) (Numeric.NumType.Neg n'') instance (Numeric.NumType.NegTypeI n, Numeric.NumType.Negate n p', Numeric.NumType.Div (Numeric.NumType.Pos p') (Numeric.NumType.Pos p) (Numeric.NumType.Pos p''), Numeric.NumType.Negate (Numeric.NumType.Pos p'') (Numeric.NumType.Neg n''), Numeric.NumType.PosTypeI p) => Numeric.NumType.Div (Numeric.NumType.Neg n) (Numeric.NumType.Pos p) (Numeric.NumType.Neg n'') instance Numeric.NumType.NumTypeI n => Numeric.NumType.Mul n Numeric.NumType.Zero Numeric.NumType.Zero instance (Numeric.NumType.NumTypeI a, Numeric.NumType.NumTypeI c, Numeric.NumType.PosTypeI p, Numeric.NumType.Div c (Numeric.NumType.Pos p) a) => Numeric.NumType.Mul a (Numeric.NumType.Pos p) c instance (Numeric.NumType.NumTypeI a, Numeric.NumType.NumTypeI c, Numeric.NumType.NegTypeI n, Numeric.NumType.Div c (Numeric.NumType.Neg n) a) => Numeric.NumType.Mul a (Numeric.NumType.Neg n) c