sig
  exception Overflow
  exception NaN
  type 'a numeric =
    'BatNumber.numeric = {
    zero : 'a;
    one : 'a;
    neg : '-> 'a;
    succ : '-> 'a;
    pred : '-> 'a;
    abs : '-> 'a;
    add : '-> '-> 'a;
    sub : '-> '-> 'a;
    mul : '-> '-> 'a;
    div : '-> '-> 'a;
    modulo : '-> '-> 'a;
    pow : '-> '-> 'a;
    compare : '-> '-> int;
    of_int : int -> 'a;
    to_int : '-> int;
    of_string : string -> 'a;
    to_string : '-> string;
    of_float : float -> 'a;
    to_float : '-> float;
  }
  module type Numeric =
    sig
      type t
      val zero : t
      val one : t
      val neg : t -> t
      val abs : t -> t
      val add : t -> t -> t
      val sub : t -> t -> t
      val mul : t -> t -> t
      val div : t -> t -> t
      val modulo : t -> t -> t
      val pow : t -> t -> t
      val compare : t -> t -> int
      val of_int : int -> t
      val to_int : t -> int
      val of_float : float -> t
      val to_float : t -> float
      val of_string : string -> t
      val to_string : t -> string
      val ( + ) : t -> t -> t
      val ( - ) : t -> t -> t
      val ( * ) : t -> t -> t
      val ( / ) : t -> t -> t
      val ( ** ) : t -> t -> t
      val ( <> ) : t -> t -> bool
      val ( >= ) : t -> t -> bool
      val ( <= ) : t -> t -> bool
      val ( > ) : t -> t -> bool
      val ( < ) : t -> t -> bool
      val ( = ) : t -> t -> bool
      val operations : t numeric
    end
  module type Bounded = sig type t val min_num : t val max_num : t end
  module type Discrete =
    sig
      type t
      val to_int : t -> int
      val succ : t -> t
      val pred : t -> t
      val ( -- ) : t -> t -> t BatEnum.t
      val ( --- ) : t -> t -> t BatEnum.t
    end
  module type NUMERIC_BASE =
    sig
      type t
      val zero : t
      val one : t
      val neg : t -> t
      val succ : t -> t
      val pred : t -> t
      val abs : t -> t
      val add : t -> t -> t
      val sub : t -> t -> t
      val mul : t -> t -> t
      val div : t -> t -> t
      val modulo : t -> t -> t
      val pow : t -> t -> t
      val compare : t -> t -> int
      val of_int : int -> t
      val to_int : t -> int
      val of_string : string -> t
      val to_string : t -> string
      val of_float : float -> t
      val to_float : t -> float
    end
  module MakeNumeric :
    functor (Base : NUMERIC_BASE->
      sig
        val operations : Base.t numeric
        val ( + ) : Base.t -> Base.t -> Base.t
        val ( - ) : Base.t -> Base.t -> Base.t
        val ( * ) : Base.t -> Base.t -> Base.t
        val ( / ) : Base.t -> Base.t -> Base.t
        val ( ** ) : Base.t -> Base.t -> Base.t
        val ( <> ) : Base.t -> Base.t -> bool
        val ( >= ) : Base.t -> Base.t -> bool
        val ( <= ) : Base.t -> Base.t -> bool
        val ( > ) : Base.t -> Base.t -> bool
        val ( < ) : Base.t -> Base.t -> bool
        val ( = ) : Base.t -> Base.t -> bool
      end
  val generic_pow :
    zero:'->
    one:'->
    div_two:('-> 'a) ->
    mod_two:('-> 'a) -> mul:('-> '-> 'a) -> '-> '-> 'a
end