258 | print_stmt (name, Code_Thingol.Classinst |
258 | print_stmt (name, Code_Thingol.Classinst |
259 { class, tyco, vs, inst_params, superinst_params, ... }) = |
259 { class, tyco, vs, inst_params, superinst_params, ... }) = |
260 let |
260 let |
261 val tyvars = intro_tyvars vs reserved; |
261 val tyvars = intro_tyvars vs reserved; |
262 val classtyp = (class, tyco `%% map (ITyVar o fst) vs); |
262 val classtyp = (class, tyco `%% map (ITyVar o fst) vs); |
263 fun print_classparam_instance ((classparam, (const as { dom, ... }, _)), (thm, _)) = |
263 fun print_classparam_instance ((classparam, (const as { dom, ... }, dom_length)), (thm, _)) = |
264 let |
264 let |
265 val aux_dom = Name.invent_names (snd reserved) "a" dom; |
265 val aux_dom = Name.invent_names (snd reserved) "a" dom; |
266 val auxs = map fst aux_dom; |
266 val auxs = map fst aux_dom; |
267 val vars = intro_vars auxs reserved; |
267 val vars = intro_vars auxs reserved; |
268 val aux_abstr = if null auxs then [] else [enum "," "(" ")" |
268 val (aux_dom1, aux_dom2) = chop dom_length aux_dom; |
269 (map (fn (aux, ty) => constraint ((str o lookup_var vars) aux) |
269 fun abstract_using [] = [] |
270 (print_typ tyvars NOBR ty)) aux_dom), str "=>"]; |
270 | abstract_using aux_dom = [enum "," "(" ")" |
|
271 (map (fn (aux, ty) => constraint ((str o lookup_var vars) aux) |
|
272 (print_typ tyvars NOBR ty)) aux_dom), str "=>"]; |
|
273 val aux_abstr1 = abstract_using aux_dom1; |
|
274 val aux_abstr2 = abstract_using aux_dom2; |
271 in |
275 in |
272 concat ([str "val", print_method classparam, str "="] |
276 concat ([str "val", print_method classparam, str "="] |
273 @ aux_abstr @| print_app tyvars false (SOME thm) vars NOBR |
277 @ aux_abstr1 @ aux_abstr2 @| print_app tyvars false (SOME thm) vars NOBR |
274 (const, map (IVar o SOME) auxs)) |
278 (const, map (IVar o SOME) auxs)) |
275 end; |
279 end; |
276 in |
280 in |
277 Pretty.block_enclose (concat [str "implicit def", |
281 Pretty.block_enclose (concat [str "implicit def", |
278 constraint (print_context tyvars vs name) (print_dicttyp tyvars classtyp), |
282 constraint (print_context tyvars vs name) (print_dicttyp tyvars classtyp), |