sig
  type type_meta
  type concrete
  type variable
  type func
  val func : Type.type_meta -> Type.type_meta -> Type.type_meta
  val is_func : Type.type_meta -> bool
  val get_func : Type.type_meta -> Type.func option
  val decompose_func : Type.func -> Type.type_meta * Type.type_meta
  val is_ground : Type.type_meta -> bool
  type subst = Type.variable * Type.type_meta
  type substs
  val subst :
    Type.variable -> Type.type_meta -> Type.type_meta -> Type.type_meta
  val substs : Type.substs -> Type.type_meta -> Type.type_meta
  val substs_to_list : Type.substs -> Type.subst list
  val unify :
    Type.type_meta -> Type.type_meta -> (Type.type_meta * Type.substs) option
  val is_unifiable : Type.type_meta -> Type.type_meta -> bool
  val specialise :
    Type.type_meta -> Type.type_meta -> (Type.type_meta * Type.substs) option
  val is_specialisable : Type.type_meta -> Type.type_meta -> bool
  val type_meta_equal : Type.type_meta -> Type.type_meta -> bool
  val type_meta_equivelent : Type.type_meta -> Type.type_meta -> bool
  val type_meta_hash : Type.type_meta -> int
  val canonicalize : Type.type_meta -> Type.type_meta
  module TypeMetaHashtbl :
    sig
      type key = type_meta
      type 'a t
      val create : int -> 'a t
      val clear : 'a t -> unit
      val copy : 'a t -> 'a t
      val add : 'a t -> key -> '-> unit
      val remove : 'a t -> key -> unit
      val find : 'a t -> key -> 'a
      val find_all : 'a t -> key -> 'a list
      val replace : 'a t -> key -> '-> unit
      val mem : 'a t -> key -> bool
      val iter : (key -> '-> unit) -> 'a t -> unit
      val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
      val length : 'a t -> int
    end
  val type_meta_shower : Type.type_meta Show.show
  val subst_shower : Type.subst Show.show
  val substs_shower : Type.substs Show.show
  val unify_shower :
    (Type.type_meta * Type.substs * Type.substs) option Show.show
  val toplevel_type_meta_printer : Format.formatter -> Type.type_meta -> unit
  val variable_context : unit -> string option -> Type.type_meta
  val new_base_type : string -> Type.type_meta
  val new_poly_type : string -> Type.type_meta list -> Type.type_meta
  val new_func_type : Type.type_meta -> Type.type_meta -> Type.type_meta
end