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