sig
  type 'a t
  type precedence = Basic | Call | Couple | List | NoPar
  val par :
    Type.precedence ->
    Type.precedence -> Format.formatter -> (Format.formatter -> unit) -> unit
  exception AlreadyExists of string
  val register :
    name:string ->
    value_name:string option ->
    ?pp:(Type.precedence -> Format.formatter -> '-> unit) ->
    ?varname:('-> string) -> '-> 'Type.t
  val name : 'Type.t -> string
  val pp_value_name :
    'Type.t -> Type.precedence -> Format.formatter -> unit
  val register_pp :
    'Type.t -> (Type.precedence -> Format.formatter -> '-> unit) -> unit
  exception NoPrinter of string
  val pp : 'Type.t -> Type.precedence -> Format.formatter -> '-> unit
  val varname : 'Type.t -> ('-> string) option
  val use_pp : 'Type.t -> Format.formatter -> '-> unit
  exception Not_dynamic of string
  type ty
  val get_dynamic : string -> Type.ty Type.t
  val is_dynamic : 'Type.t -> bool
  val equal : 'Type.t -> 'Type.t -> bool
  val compare : 'Type.t -> 'Type.t -> int
  val hash : 'Type.t -> int
  val unit : unit Type.t
  val bool : bool Type.t
  val int : int Type.t
  val int32 : int32 Type.t
  val int64 : int64 Type.t
  val nativeint : nativeint Type.t
  val float : float Type.t
  val char : char Type.t
  val string : string Type.t
  val formatter : Format.formatter Type.t
  val no_pp : Type.precedence -> Format.formatter -> '-> unit
  module type POLYMORPHIC =
    sig
      type 'a poly
      val instantiate : 'Type.t -> 'Type.POLYMORPHIC.poly Type.t
      val is_instance_of : 'Type.t -> bool
      val get_instance : 'Type.POLYMORPHIC.poly Type.t -> 'Type.t
    end
  module Polymorphic :
    functor
      (D : sig
             val name : 'Type.t -> string
             val value_name : string
             type 'a t
             val repr : '-> 'Type.Polymorphic.t
             val pp :
               (Type.precedence -> Format.formatter -> '-> unit) ->
               Type.precedence ->
               Format.formatter -> 'Type.Polymorphic.t -> unit
           end->
      sig
        type 'a poly = 'D.t
        val instantiate : 'a t -> 'a poly t
        val is_instance_of : 'a t -> bool
        val get_instance : 'a poly t -> 'a t
      end
  module type POLYMORPHIC2 =
    sig
      type ('a, 'b) poly
      val instantiate :
        'Type.t -> 'Type.t -> ('a, 'b) Type.POLYMORPHIC2.poly Type.t
      val is_instance_of : 'Type.t -> bool
      val get_instance :
        ('a, 'b) Type.POLYMORPHIC2.poly Type.t -> 'Type.t * 'Type.t
    end
  module Polymorphic2 :
    functor
      (D : sig
             val name : 'Type.t -> 'Type.t -> string
             val value_name : string
             type ('a, 'b) t
             val repr : '-> '-> ('a, 'b) Type.Polymorphic2.t
             val pp :
               (Type.precedence -> Format.formatter -> '-> unit) ->
               (Type.precedence -> Format.formatter -> '-> unit) ->
               Type.precedence ->
               Format.formatter -> ('a, 'b) Type.Polymorphic2.t -> unit
           end->
      sig
        type ('a, 'b) poly = ('a, 'b) D.t
        val instantiate : 'a t -> 'b t -> ('a, 'b) poly t
        val is_instance_of : 'a t -> bool
        val get_instance : ('a, 'b) poly t -> 'a t * 'b t
      end
  module Ref :
    sig
      type 'a poly = 'a ref
      val instantiate : 'a t -> 'a poly t
      val is_instance_of : 'a t -> bool
      val get_instance : 'a poly t -> 'a t
    end
  val t_ref : 'Type.t -> 'Pervasives.ref Type.t
  module Option :
    sig
      type 'a poly = 'a option
      val instantiate : 'a t -> 'a poly t
      val is_instance_of : 'a t -> bool
      val get_instance : 'a poly t -> 'a t
    end
  val option : 'Type.t -> 'a option Type.t
  module List :
    sig
      type 'a poly = 'a list
      val instantiate : 'a t -> 'a poly t
      val is_instance_of : 'a t -> bool
      val get_instance : 'a poly t -> 'a t
    end
  val list : 'Type.t -> 'a list Type.t
  module Couple :
    sig
      type ('a, 'b) poly = 'a * 'b
      val instantiate : 'a t -> 'b t -> ('a, 'b) poly t
      val is_instance_of : 'a t -> bool
      val get_instance : ('a, 'b) poly t -> 'a t * 'b t
    end
  val couple : 'Type.t -> 'Type.t -> ('a * 'b) Type.t
  module Function :
    sig
      type ('a, 'b) poly
      val instantiate :
        ?label:string * (unit -> 'a) option ->
        'Type.t -> 'Type.t -> ('-> 'b) Type.t
      val is_instance_of : 'Type.t -> bool
      val get_instance :
        ('a, 'b) Type.Function.poly Type.t ->
        'Type.t * 'Type.t * (string * (unit -> 'a) option) option
    end
  val func :
    ?label:string * (unit -> 'a) option ->
    'Type.t -> 'Type.t -> ('-> 'b) Type.t
  val optlabel_func :
    string -> (unit -> 'a) -> 'Type.t -> 'Type.t -> ('-> 'b) Type.t
  module StringTbl :
    sig
      type 'a ty = 'Type.t
      type t
      val create : int -> Type.StringTbl.t
      val add :
        Type.StringTbl.t -> string -> 'Type.StringTbl.ty -> '-> 'a
      exception Unbound_value of string
      exception Incompatible_type of string
      val find : Type.StringTbl.t -> string -> 'Type.StringTbl.ty -> 'a
    end
  module TyTbl :
    sig
      type 'a ty = 'Type.t
      type 'a t
      val create : int -> 'Type.TyTbl.t
      val add : 'Type.TyTbl.t -> 'Type.TyTbl.ty -> '-> unit
      val find : 'Type.TyTbl.t -> 'Type.TyTbl.ty -> 'a
    end
  module Binding :
    sig
      val add : 'Type.t -> '-> string -> unit
      exception Name_already_exists of string
      val add_once : 'Type.t -> '-> string -> unit
    end
  val no_obj : unit -> unit
end