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