Portability | unportable (GHC only) |
---|---|

Stability | unstable |

Maintainer | Alexey Khudyakov <alexey.skladnoy@gmail.com> |

Safe Haskell | Safe-Inferred |

This module contain interface type classes for operations with type level numbers.

- type family Compare n m :: *
- compareN :: n -> m -> Compare n m
- data IsLesser
- data IsEqual
- data IsGreater
- class Lesser n m
- class LesserEq n m
- class Greater n m
- class GreaterEq n m
- class Positive n
- class NonZero n
- type family Next n :: *
- nextN :: n -> Next n
- type family Prev n :: *
- prevN :: n -> Prev n
- type family Negate n :: *
- negateN :: n -> Negate n
- type family Add n m :: *
- addN :: n -> m -> Add n m
- type family Sub n m :: *
- subN :: n -> m -> Sub n m
- type family Mul n m :: *
- mulN :: n -> m -> Mul n m
- type family Div n m :: *
- divN :: n -> m -> Div n m
- type family Normalized n :: *

# Comparison of numbers

type family Compare n m :: *Source

Type family for comparing two numbers. It's expected that for any
two valid `n`

and `m`

'Compare n m' is equal to IsLess when 'n<m', IsEqual
when 'n=m' and IsGreater when 'n>m'.

## Data labels for types comparison

## Specialized type classes

These type classes are meant to be used in contexts to ensure relations between numbers. For example:

someFunction :: Lesser n m => Data n -> Data m -> Data n someFunction = ...

They have generic instances and every number which is instance of Compare type family is instance of these type classes.

These instance could have problems. They weren't exensively tested. Also error messages are really unhelpful.

Numbers n and m are instances of this class if and only is n < m.

Numbers n and m are instances of this class if and only is n <= m.

Numbers n and m are instances of this class if and only is n > m.

Numbers n and m are instances of this class if and only is n >= m.

## Special traits

Non-zero number. For naturals it's same as positive

# Arithmetic operations on numbers

type family Div n m :: *Source

Division of two numbers. `n`

and `m`

should be instances of this
class only if remainder of 'n/m' is zero.

# Special classes

type family Normalized n :: *Source

Usually numbers have non-unique representation. This type family is canonical representation of number.