sig
  exception Overflow
  exception NaN
  type 'a numeric =
    'a BatNumber.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;
  }
  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:'a ->
    one:'a ->
    div_two:('a -> 'a) ->
    mod_two:('a -> 'a) -> mul:('a -> 'a -> 'a) -> 'a -> 'a -> 'a
end