601 fun varify_parms (i, ps) = map (apsnd (varify i)) (param_types ps); |
601 fun varify_parms (i, ps) = map (apsnd (varify i)) (param_types ps); |
602 val parms = fixed_parms @ maps varify_parms idx_parmss; |
602 val parms = fixed_parms @ maps varify_parms idx_parmss; |
603 |
603 |
604 fun unify T U envir = Sign.typ_unify thy (U, T) envir |
604 fun unify T U envir = Sign.typ_unify thy (U, T) envir |
605 handle Type.TUNIFY => |
605 handle Type.TUNIFY => |
606 let val prt = Sign.string_of_typ thy in |
606 let |
|
607 val T' = Envir.norm_type (fst envir) T; |
|
608 val U' = Envir.norm_type (fst envir) U; |
|
609 val prt = Sign.string_of_typ thy; |
|
610 in |
607 raise TYPE ("unify_parms: failed to unify types " ^ |
611 raise TYPE ("unify_parms: failed to unify types " ^ |
608 prt U ^ " and " ^ prt T, [U, T], []) |
612 prt U' ^ " and " ^ prt T', [U', T'], []) |
609 end; |
613 end; |
610 fun unify_list (T :: Us) = fold (unify T) Us |
614 fun unify_list (T :: Us) = fold (unify T) Us |
611 | unify_list [] = I; |
615 | unify_list [] = I; |
612 val (unifier, _) = fold unify_list (map #2 (Symtab.dest (Symtab.make_list parms))) |
616 val (unifier, _) = fold unify_list (map #2 (Symtab.dest (Symtab.make_list parms))) |
613 (Vartab.empty, maxidx); |
617 (Vartab.empty, maxidx); |