let type_instance (q, t) = acyclic t; let copy t = let t = repr t in t, tvar() in let copied = List.map copy q in let rec visit t = let t = repr t in try List.assq t copied with Not_found -> begin match desc t with | Tvar _ | Tcon (_, []) -> t | Tcon (g, l) -> texp (Tcon (g, List.map visit l)) end in visit t;;