@@ -13,6 +13,8 @@ import qualified AST.Pattern as P
13import qualified AST.Type as ST
13import qualified AST.Type as ST
14import qualified AST.Variable as V
14import qualified AST.Variable as V
15import qualified Reporting.Annotation as A
15import qualified Reporting.Annotation as A
16+import qualified Reporting.Error.Type as Error
17+import qualified Reporting.Region as R
16import qualified Type.Constrain.Literal as Literal
18import qualified Type.Constrain.Literal as Literal
17import qualified Type.Constrain.Pattern as Pattern
19import qualified Type.Constrain.Pattern as Pattern
18import qualified Type.Environment as Env
20import qualified Type.Environment as Env
@@ -27,7 +29,7 @@ constrain
27 -> IO TypeConstraint
29 -> IO TypeConstraint
28constrain env (A.A region expression) tipe =
30constrain env (A.A region expression) tipe =
29 let list t = Env.get env Env.types "List" <| t
31 let list t = Env.get env Env.types "List" <| t
30− (===) = CEqual region
32+ (===) = CEqual Error.None region
31 (<?) = CInstance region
33 (<?) = CInstance region
33 case expression of
35 case expression of
@@ -113,15 +115,7 @@ constrain env (A.A region expression) tipe =
113 return (cb /\ ce)
115 return (cb /\ ce)
115 E.Case expr branches ->
117 E.Case expr branches ->
116− exists $ \t ->
118+ constrainCase env region expr branches tipe
117− do exprConstraint <- constrain env expr t
118− branchConstraints <- mapM (branch t) branches
119− return (CAnd (exprConstraint : branchConstraints))
121− branch t (pattern, branchExpr) =
122− do fragment <- Pattern.constrain env pattern t
123− branchConstraint <- constrain env branchExpr tipe
124− return (CLet [Fragment.toScheme fragment] branchConstraint)
126 E.Data name exprs ->
120 E.Data name exprs ->
127 do vars <- Monad.forM exprs $ \_ -> variable Flexible
121 do vars <- Monad.forM exprs $ \_ -> variable Flexible
@@ -200,6 +194,46 @@ constrain env (A.A region expression) tipe =
200 constrain env expr tipe
194 constrain env expr tipe
197+-- CONSTRAIN CASE EXPRESSIONS
203+ -> [(P.CanonicalPattern, Canonical.Expr)]
205+ -> IO TypeConstraint
206+constrainCase env region expr branches tipe =
207+ do exprVar <- variable Flexible
209+ exprCon <- constrain env expr (varN exprVar)
211+ (branchVars, regions, branchExprCons) <-
212+ unzip3 <$> mapM (branch (varN exprVar)) branches
215+ zipWith3 branchEqual [1..] branchVars regions
218+ ex (exprVar:branchVars)
219+ (CAnd (exprCon : branchExprCons ++ branchCons))
221+ branch patternType (pattern, branchExpr@(A.A branchRegion _)) =
222+ do branchVar <- variable Flexible
223+ fragment <- Pattern.constrain env pattern patternType
224+ branchCon <- constrain env branchExpr (varN branchVar)
228+ , CLet [Fragment.toScheme fragment] branchCon
231+ branchEqual n var branchRegion =
232+ CEqual (Error.CaseBranch n branchRegion) region tipe (varN var)
203expandPattern :: Canonical.Def -> [Canonical.Def]
237expandPattern :: Canonical.Def -> [Canonical.Def]
204expandPattern def@(Canonical.Definition lpattern expr maybeType) =
238expandPattern def@(Canonical.Definition lpattern expr maybeType) =
205 let (A.A patternRegion pattern) = lpattern
239 let (A.A patternRegion pattern) = lpattern