sig
  exception Overflow
  exception NaN
  type 'a 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 Infix =
    sig
      type bat__infix_t
      val ( + ) :
        BatNumber.Infix.bat__infix_t ->
        BatNumber.Infix.bat__infix_t -> BatNumber.Infix.bat__infix_t
      val ( - ) :
        BatNumber.Infix.bat__infix_t ->
        BatNumber.Infix.bat__infix_t -> BatNumber.Infix.bat__infix_t
      val ( * ) :
        BatNumber.Infix.bat__infix_t ->
        BatNumber.Infix.bat__infix_t -> BatNumber.Infix.bat__infix_t
      val ( / ) :
        BatNumber.Infix.bat__infix_t ->
        BatNumber.Infix.bat__infix_t -> BatNumber.Infix.bat__infix_t
      val ( ** ) :
        BatNumber.Infix.bat__infix_t ->
        BatNumber.Infix.bat__infix_t -> BatNumber.Infix.bat__infix_t
      val ( -- ) :
        BatNumber.Infix.bat__infix_t ->
        BatNumber.Infix.bat__infix_t ->
        BatNumber.Infix.bat__infix_t BatEnum.t
      val ( --- ) :
        BatNumber.Infix.bat__infix_t ->
        BatNumber.Infix.bat__infix_t ->
        BatNumber.Infix.bat__infix_t BatEnum.t
    end
  module type Compare =
    sig
      type bat__compare_t
      val ( <> ) :
        BatNumber.Compare.bat__compare_t ->
        BatNumber.Compare.bat__compare_t -> bool
      val ( >= ) :
        BatNumber.Compare.bat__compare_t ->
        BatNumber.Compare.bat__compare_t -> bool
      val ( <= ) :
        BatNumber.Compare.bat__compare_t ->
        BatNumber.Compare.bat__compare_t -> bool
      val ( > ) :
        BatNumber.Compare.bat__compare_t ->
        BatNumber.Compare.bat__compare_t -> bool
      val ( < ) :
        BatNumber.Compare.bat__compare_t ->
        BatNumber.Compare.bat__compare_t -> bool
      val ( = ) :
        BatNumber.Compare.bat__compare_t ->
        BatNumber.Compare.bat__compare_t -> bool
    end
  module type RefOps =
    sig
      type bat__refops_t
      val ( += ) :
        BatNumber.RefOps.bat__refops_t Stdlib.ref ->
        BatNumber.RefOps.bat__refops_t -> unit
      val ( -= ) :
        BatNumber.RefOps.bat__refops_t Stdlib.ref ->
        BatNumber.RefOps.bat__refops_t -> unit
      val ( *= ) :
        BatNumber.RefOps.bat__refops_t Stdlib.ref ->
        BatNumber.RefOps.bat__refops_t -> unit
      val ( /= ) :
        BatNumber.RefOps.bat__refops_t Stdlib.ref ->
        BatNumber.RefOps.bat__refops_t -> unit
    end
  module type Numeric =
    sig
      type t
      val zero : BatNumber.Numeric.t
      val one : BatNumber.Numeric.t
      val neg : BatNumber.Numeric.t -> BatNumber.Numeric.t
      val abs : BatNumber.Numeric.t -> BatNumber.Numeric.t
      val add :
        BatNumber.Numeric.t -> BatNumber.Numeric.t -> BatNumber.Numeric.t
      val sub :
        BatNumber.Numeric.t -> BatNumber.Numeric.t -> BatNumber.Numeric.t
      val mul :
        BatNumber.Numeric.t -> BatNumber.Numeric.t -> BatNumber.Numeric.t
      val div :
        BatNumber.Numeric.t -> BatNumber.Numeric.t -> BatNumber.Numeric.t
      val modulo :
        BatNumber.Numeric.t -> BatNumber.Numeric.t -> BatNumber.Numeric.t
      val pow :
        BatNumber.Numeric.t -> BatNumber.Numeric.t -> BatNumber.Numeric.t
      val compare : BatNumber.Numeric.t -> BatNumber.Numeric.t -> int
      val equal : BatNumber.Numeric.t -> BatNumber.Numeric.t -> bool
      val ord : BatNumber.Numeric.t BatOrd.ord
      val of_int : int -> BatNumber.Numeric.t
      val to_int : BatNumber.Numeric.t -> int
      val of_float : float -> BatNumber.Numeric.t
      val to_float : BatNumber.Numeric.t -> float
      val of_string : string -> BatNumber.Numeric.t
      val to_string : BatNumber.Numeric.t -> string
      val operations : BatNumber.Numeric.t BatNumber.numeric
      type discrete = BatNumber.Numeric.t
      val succ : BatNumber.Numeric.t -> BatNumber.Numeric.t
      val pred : BatNumber.Numeric.t -> BatNumber.Numeric.t
      module Infix :
        sig
          type bat__infix_t = t
          val ( + ) : bat__infix_t -> bat__infix_t -> bat__infix_t
          val ( - ) : bat__infix_t -> bat__infix_t -> bat__infix_t
          val ( * ) : bat__infix_t -> bat__infix_t -> bat__infix_t
          val ( / ) : bat__infix_t -> bat__infix_t -> bat__infix_t
          val ( ** ) : bat__infix_t -> bat__infix_t -> bat__infix_t
          val ( -- ) : bat__infix_t -> bat__infix_t -> bat__infix_t BatEnum.t
          val ( --- ) :
            bat__infix_t -> bat__infix_t -> bat__infix_t BatEnum.t
        end
      module Compare :
        sig
          type bat__compare_t = t
          val ( <> ) : bat__compare_t -> bat__compare_t -> bool
          val ( >= ) : bat__compare_t -> bat__compare_t -> bool
          val ( <= ) : bat__compare_t -> bat__compare_t -> bool
          val ( > ) : bat__compare_t -> bat__compare_t -> bool
          val ( < ) : bat__compare_t -> bat__compare_t -> bool
          val ( = ) : bat__compare_t -> bat__compare_t -> bool
        end
      type bat__infix_t = t
      val ( + ) : bat__infix_t -> bat__infix_t -> bat__infix_t
      val ( - ) : bat__infix_t -> bat__infix_t -> bat__infix_t
      val ( * ) : bat__infix_t -> bat__infix_t -> bat__infix_t
      val ( / ) : bat__infix_t -> bat__infix_t -> bat__infix_t
      val ( ** ) : bat__infix_t -> bat__infix_t -> bat__infix_t
      val ( -- ) : bat__infix_t -> bat__infix_t -> bat__infix_t BatEnum.t
      val ( --- ) : bat__infix_t -> bat__infix_t -> bat__infix_t BatEnum.t
      type bat__refops_t = t
      val ( += ) : bat__refops_t ref -> bat__refops_t -> unit
      val ( -= ) : bat__refops_t ref -> bat__refops_t -> unit
      val ( *= ) : bat__refops_t ref -> bat__refops_t -> unit
      val ( /= ) : bat__refops_t ref -> bat__refops_t -> unit
    end
  module type Bounded =
    sig
      type bounded
      val min_num : BatNumber.Bounded.bounded
      val max_num : BatNumber.Bounded.bounded
    end
  module type Discrete =
    sig
      type discrete
      val to_int : BatNumber.Discrete.discrete -> int
      val succ : BatNumber.Discrete.discrete -> BatNumber.Discrete.discrete
      val pred : BatNumber.Discrete.discrete -> BatNumber.Discrete.discrete
      val ( -- ) :
        BatNumber.Discrete.discrete ->
        BatNumber.Discrete.discrete -> BatNumber.Discrete.discrete BatEnum.t
      val ( --- ) :
        BatNumber.Discrete.discrete ->
        BatNumber.Discrete.discrete -> BatNumber.Discrete.discrete BatEnum.t
    end
  module type NUMERIC_BASE =
    sig
      type t
      val zero : BatNumber.NUMERIC_BASE.t
      val one : BatNumber.NUMERIC_BASE.t
      val neg : BatNumber.NUMERIC_BASE.t -> BatNumber.NUMERIC_BASE.t
      val succ : BatNumber.NUMERIC_BASE.t -> BatNumber.NUMERIC_BASE.t
      val pred : BatNumber.NUMERIC_BASE.t -> BatNumber.NUMERIC_BASE.t
      val abs : BatNumber.NUMERIC_BASE.t -> BatNumber.NUMERIC_BASE.t
      val add :
        BatNumber.NUMERIC_BASE.t ->
        BatNumber.NUMERIC_BASE.t -> BatNumber.NUMERIC_BASE.t
      val sub :
        BatNumber.NUMERIC_BASE.t ->
        BatNumber.NUMERIC_BASE.t -> BatNumber.NUMERIC_BASE.t
      val mul :
        BatNumber.NUMERIC_BASE.t ->
        BatNumber.NUMERIC_BASE.t -> BatNumber.NUMERIC_BASE.t
      val div :
        BatNumber.NUMERIC_BASE.t ->
        BatNumber.NUMERIC_BASE.t -> BatNumber.NUMERIC_BASE.t
      val modulo :
        BatNumber.NUMERIC_BASE.t ->
        BatNumber.NUMERIC_BASE.t -> BatNumber.NUMERIC_BASE.t
      val pow :
        BatNumber.NUMERIC_BASE.t ->
        BatNumber.NUMERIC_BASE.t -> BatNumber.NUMERIC_BASE.t
      val compare :
        BatNumber.NUMERIC_BASE.t -> BatNumber.NUMERIC_BASE.t -> int
      val of_int : int -> BatNumber.NUMERIC_BASE.t
      val to_int : BatNumber.NUMERIC_BASE.t -> int
      val of_string : string -> BatNumber.NUMERIC_BASE.t
      val to_string : BatNumber.NUMERIC_BASE.t -> string
      val of_float : float -> BatNumber.NUMERIC_BASE.t
      val to_float : BatNumber.NUMERIC_BASE.t -> float
    end
  module MakeInfix :
    functor (Base : NUMERIC_BASE->
      sig
        type bat__infix_t = Base.t
        val ( + ) : bat__infix_t -> bat__infix_t -> bat__infix_t
        val ( - ) : bat__infix_t -> bat__infix_t -> bat__infix_t
        val ( * ) : bat__infix_t -> bat__infix_t -> bat__infix_t
        val ( / ) : bat__infix_t -> bat__infix_t -> bat__infix_t
        val ( ** ) : bat__infix_t -> bat__infix_t -> bat__infix_t
        val ( -- ) : bat__infix_t -> bat__infix_t -> bat__infix_t BatEnum.t
        val ( --- ) : bat__infix_t -> bat__infix_t -> bat__infix_t BatEnum.t
      end
  module MakeCompare :
    functor (Base : NUMERIC_BASE->
      sig
        type bat__compare_t = Base.t
        val ( <> ) : bat__compare_t -> bat__compare_t -> bool
        val ( >= ) : bat__compare_t -> bat__compare_t -> bool
        val ( <= ) : bat__compare_t -> bat__compare_t -> bool
        val ( > ) : bat__compare_t -> bat__compare_t -> bool
        val ( < ) : bat__compare_t -> bat__compare_t -> bool
        val ( = ) : bat__compare_t -> bat__compare_t -> bool
      end
  module MakeRefOps :
    functor (Base : NUMERIC_BASE->
      sig
        type bat__refops_t = Base.t
        val ( += ) : bat__refops_t ref -> bat__refops_t -> unit
        val ( -= ) : bat__refops_t ref -> bat__refops_t -> unit
        val ( *= ) : bat__refops_t ref -> bat__refops_t -> unit
        val ( /= ) : bat__refops_t ref -> bat__refops_t -> unit
      end
  module MakeNumeric :
    functor (Base : NUMERIC_BASE->
      sig
        type t = Base.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 equal : t -> t -> bool
        val ord : t BatOrd.ord
        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 operations : t numeric
        type discrete = t
        val succ : t -> t
        val pred : t -> t
        module Infix :
          sig
            type bat__infix_t = t
            val ( + ) : bat__infix_t -> bat__infix_t -> bat__infix_t
            val ( - ) : bat__infix_t -> bat__infix_t -> bat__infix_t
            val ( * ) : bat__infix_t -> bat__infix_t -> bat__infix_t
            val ( / ) : bat__infix_t -> bat__infix_t -> bat__infix_t
            val ( ** ) : bat__infix_t -> bat__infix_t -> bat__infix_t
            val ( -- ) :
              bat__infix_t -> bat__infix_t -> bat__infix_t BatEnum.t
            val ( --- ) :
              bat__infix_t -> bat__infix_t -> bat__infix_t BatEnum.t
          end
        module Compare :
          sig
            type bat__compare_t = t
            val ( <> ) : bat__compare_t -> bat__compare_t -> bool
            val ( >= ) : bat__compare_t -> bat__compare_t -> bool
            val ( <= ) : bat__compare_t -> bat__compare_t -> bool
            val ( > ) : bat__compare_t -> bat__compare_t -> bool
            val ( < ) : bat__compare_t -> bat__compare_t -> bool
            val ( = ) : bat__compare_t -> bat__compare_t -> bool
          end
        type bat__infix_t = t
        val ( + ) : bat__infix_t -> bat__infix_t -> bat__infix_t
        val ( - ) : bat__infix_t -> bat__infix_t -> bat__infix_t
        val ( * ) : bat__infix_t -> bat__infix_t -> bat__infix_t
        val ( / ) : bat__infix_t -> bat__infix_t -> bat__infix_t
        val ( ** ) : bat__infix_t -> bat__infix_t -> bat__infix_t
        val ( -- ) : bat__infix_t -> bat__infix_t -> bat__infix_t BatEnum.t
        val ( --- ) : bat__infix_t -> bat__infix_t -> bat__infix_t BatEnum.t
        type bat__refops_t = t
        val ( += ) : bat__refops_t ref -> bat__refops_t -> unit
        val ( -= ) : bat__refops_t ref -> bat__refops_t -> unit
        val ( *= ) : bat__refops_t ref -> bat__refops_t -> unit
        val ( /= ) : bat__refops_t ref -> bat__refops_t -> unit
      end
  val generic_pow :
    zero:'->
    one:'->
    div_two:('-> 'a) ->
    mod_two:('-> 'a) -> mul:('-> '-> 'a) -> '-> '-> 'a
end