sig
  type ('a, 'b) poly = 'a -> 'b
  val instantiate :
    ?label:string * (unit -> 'a) option ->
    'a Type.t -> 'b Type.t -> ('a -> 'b) Type.t * bool
  val is_instance_of : 'a Type.t -> bool
  val get_instance :
    ('a -> 'b) Type.t -> 'a Type.t * 'b Type.t * string option
  val get_optional_argument : ('a -> 'b) Type.t -> (unit -> 'a) option
end