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