diff options
author | Adam Chlipala <adamc@hcoop.net> | 2008-08-16 15:58:25 -0400 |
---|---|---|
committer | Adam Chlipala <adamc@hcoop.net> | 2008-08-16 15:58:25 -0400 |
commit | 402112549b47a76033fa575dc9f5e620ea214cc1 (patch) | |
tree | 839b907116d5ce5a563835d03ba54eafb9f506fb /src/elaborate.sml | |
parent | 62c0731399525d736de1c4e303c1abd1677a8d0c (diff) |
Looking up in a type class from a module
Diffstat (limited to 'src/elaborate.sml')
-rw-r--r-- | src/elaborate.sml | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/src/elaborate.sml b/src/elaborate.sml index 49498570..2046432b 100644 --- a/src/elaborate.sml +++ b/src/elaborate.sml @@ -1373,6 +1373,21 @@ fun exhaustive (env, denv, t, ps) = isTotal (combinedCoverage ps, t) end +fun normClassConstraint envs c = + let + val ((c, loc), gs1) = hnormCon envs c + in + case c of + L'.CApp (f, x) => + let + val (f, gs2) = hnormCon envs f + val (x, gs3) = hnormCon envs x + in + ((L'.CApp (f, x), loc), gs1 @ gs2 @ gs3) + end + | _ => ((c, loc), gs1) + end + fun elabExp (env, denv) (eAll as (e, loc)) = let @@ -1430,10 +1445,14 @@ fun elabExp (env, denv) (eAll as (e, loc)) = in case t1 of (L'.TFun (dom, ran), _) => - (case E.resolveClass env dom of - NONE => (expError env (Unresolvable (loc, dom)); - (eerror, cerror, [])) - | SOME pf => ((L'.EApp (e1', pf), loc), ran, gs1 @ gs2 @ gs3)) + let + val (dom, gs4) = normClassConstraint (env, denv) dom + in + case E.resolveClass env dom of + NONE => (expError env (Unresolvable (loc, dom)); + (eerror, cerror, [])) + | SOME pf => ((L'.EApp (e1', pf), loc), ran, gs1 @ gs2 @ gs3 @ gs4) + end | _ => (expError env (OutOfContext loc); (eerror, cerror, [])) end |