Module Batteries.Number

module Number: BatNumber

exception Overflow

Arithmetic overflow.

This kind of exception is raised by "safe" numeric modules whenever the number which should be returned is too large to be represented.

Non-"safe" numeric modules will return a result which depends on the internal representation. For instance, with module Int, max_num + 1 returns min_num. By opposition, with module Safe_int, max_num + 1 raises Overflow.

exception NaN

Not a Number

This kind of exception is raised by "safe" modules whenever the number which should be returned is not a number.

For instance, with module Safe_float, 0.0 / 0.0 raises NaN. By opposition, with module Float, 0.0 / 0.0 does not interrupt computation and returns a special value nan.

type 'a numeric = {
   zero : 'a;
   one : 'a;
   neg : 'a -> 'a;
   succ : 'a -> 'a;
   pred : 'a -> 'a;
   abs : 'a -> 'a;
   add : 'a -> 'a -> 'a;
   sub : 'a -> 'a -> 'a;
   mul : 'a -> 'a -> 'a;
   div : 'a -> 'a -> 'a;
   modulo : 'a -> 'a -> 'a;
   pow : 'a -> 'a -> 'a;
   compare : 'a -> 'a -> int;
   of_int : int -> 'a;
   to_int : 'a -> int;
   of_string : string -> 'a;
   to_string : 'a -> string;
   of_float : float -> 'a;
   to_float : 'a -> float;
}

The smallest set of operations supported by every set of numbers.

This is presented as record to permit lightweight typeclass-style computation.

module type Infix = sig .. end

The infix operators available with any type of numbers

module type Compare = sig .. end

And if you are ready to drop generic comparison operators, then you can open this one as well

module type RefOps = sig .. end

Reference operators ala C.

module type Numeric = sig .. end

The full set of operations of a type of numbers

module type Bounded = sig .. end
module type Discrete = sig .. end