@@ -71,9 +71,7 @@ constrain env (A.A region expression) tipe =
71 return $ CAnd [lowCon, highCon, list n === tipe]
71 return $ CAnd [lowCon, highCon, list n === tipe]
73 E.ExplicitList exprs ->
73 E.ExplicitList exprs ->
74− exists $ \x ->
74+ constrainList env region exprs tipe
75− do constraints <- mapM (\e -> constrain env e x) exprs
76− return $ CAnd (list x === tipe : constraints)
78 E.Binop op leftExpr rightExpr ->
76 E.Binop op leftExpr rightExpr ->
79 exists $ \leftType ->
77 exists $ \leftType ->
@@ -190,6 +188,48 @@ constrain env (A.A region expression) tipe =
190 constrain env expr tipe
188 constrain env expr tipe
198+ -> IO TypeConstraint
199+constrainList env region exprs tipe =
200+ do (exprInfo, exprCons) <-
201+ unzip <$> mapM elementConstraint exprs
203+ let pairwiseCons = pairwiseConstraints 2 exprInfo
206+ ex (map fst exprInfo)
207+ (CAnd (exprCons ++ pairwiseCons))
210+ Env.get env Env.types "List" <| t
212+ elementConstraint expr@(A.A region' _) =
213+ do var <- variable Flexible
214+ con <- constrain env expr (varN var)
215+ return ( (var, region'), con )
217+ pairwiseConstraints n exprInfo =
223+ [ CEqual Error.List region tipe (list (varN var)) ]
225+ (var,_) : (var',region') : rest ->
227+ hint = Error.ListElement n region'
228+ con = CEqual hint region (varN var) (varN var')
230+ con : pairwiseConstraints (n+1) ((var', region') : rest)
193-- CONSTRAIN IF EXPRESSIONS
233-- CONSTRAIN IF EXPRESSIONS
195constrainIf
235constrainIf