on master help sign in
Fix type constraints for case-expressions
175798fEvan Czaplicki
compiler/Type/Constrain/Expression.hs+3−6
@@ -97,15 +97,12 @@ constrain env (L _ _ expr) tipe =
97 ce <- constrain env e tipe
97 ce <- constrain env e tipe
98 return (cb /\ ce)
98 return (cb /\ ce)
99
99
100− Case e branches ->
100+ Case exp branches ->
101 exists $ \t -> do
101 exists $ \t -> do
102− ce <- constrain env e t
102+ ce <- constrain env exp t
103 let branch (p,e) = do
103 let branch (p,e) = do
104 fragment <- Pattern.constrain env p t
104 fragment <- Pattern.constrain env p t
105− c <- constrain env e tipe
105+ CLet [toScheme fragment] <$> constrain env e tipe
106− return $ ex (vars fragment)
107− (CLet [monoscheme (typeEnv fragment)]
108− (typeConstraint fragment /\ c))
109 CAnd . (:) ce <$> mapM branch branches
106 CAnd . (:) ce <$> mapM branch branches
110
107
111 Data name exprs ->
108 Data name exprs ->
compiler/Type/Fragment.hs+5−1
@@ -18,6 +18,10 @@ joinFragment f1 f2 = Fragment {
18 typeEnv = Map.union (typeEnv f1) (typeEnv f2),
18 typeEnv = Map.union (typeEnv f1) (typeEnv f2),
19 vars = vars f1 ++ vars f2,
19 vars = vars f1 ++ vars f2,
20 typeConstraint = typeConstraint f1 /\ typeConstraint f2
20 typeConstraint = typeConstraint f1 /\ typeConstraint f2
21− }
21+}
22
22
23joinFragments = List.foldl' (flip joinFragment) emptyFragment
23joinFragments = List.foldl' (flip joinFragment) emptyFragment
24+
25+
26+toScheme fragment =
27+ Scheme [] (vars fragment) (typeConstraint fragment) (typeEnv fragment)