|Portability||unportable (GHC only)|
|Maintainer||Alexey Khudyakov <email@example.com>|
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 for comparing two numbers. It's expected that for any
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.
Non-zero number. For naturals it's same as positive
Arithmetic operations on numbers
Division of two numbers.
m should be instances of this
class only if remainder of 'n/m' is zero.