@@ -104,7 +104,7 @@ constrain env annotatedExpr@(A.A region expression) tipe =
104 constrainCase env region expr branches tipe
104 constrainCase env region expr branches tipe
106 C.Ctor name exprs ->
106 C.Ctor name exprs ->
107− do vars <- Monad.forM exprs $ \_ -> mkVar Nothing
107+ do vars <- mapM (\_ -> mkFlexVar) exprs
108 let pairs = zip exprs (map VarN vars)
108 let pairs = zip exprs (map VarN vars)
109 (ctipe, cs) <- Monad.foldM step (tipe, CTrue) (reverse pairs)
109 (ctipe, cs) <- Monad.foldM step (tipe, CTrue) (reverse pairs)
110 return $ ex vars (cs /\ CInstance region (V.toText name) ctipe)
110 return $ ex vars (cs /\ CInstance region (V.toText name) ctipe)
@@ -124,11 +124,11 @@ constrain env annotatedExpr@(A.A region expression) tipe =
125 C.Update expr fields ->
125 C.Update expr fields ->
126 exists $ \t ->
126 exists $ \t ->
127− do oldVars <- mapM (\_ -> mkVar Nothing) fields
127+ do oldVars <- mapM (\_ -> mkFlexVar) fields
128 let oldFields = Map.fromList (zip (map fst fields) (map VarN oldVars))
128 let oldFields = Map.fromList (zip (map fst fields) (map VarN oldVars))
129 cOld <- ex oldVars <$> constrain env expr (RecordN oldFields t)
129 cOld <- ex oldVars <$> constrain env expr (RecordN oldFields t)
131− newVars <- mapM (\_ -> mkVar Nothing) fields
131+ newVars <- mapM (\_ -> mkFlexVar) fields
132 let newFields = Map.fromList (zip (map fst fields) (map VarN newVars))
132 let newFields = Map.fromList (zip (map fst fields) (map VarN newVars))
133 let cNew = CEqual Error.Record region (RecordN newFields t) tipe
133 let cNew = CEqual Error.Record region (RecordN newFields t) tipe
@@ -137,7 +137,7 @@ constrain env annotatedExpr@(A.A region expression) tipe =
137 return $ cOld /\ ex newVars (CAnd (cNew : cs))
137 return $ cOld /\ ex newVars (CAnd (cNew : cs))
139 C.Record fields ->
139 C.Record fields ->
140− do vars <- Monad.forM fields (\_ -> mkVar Nothing)
140+ do vars <- mapM (\_ -> mkFlexVar) fields
141 fieldCons <-
141 fieldCons <-
142 Monad.zipWithM
142 Monad.zipWithM
143 (constrain env)
143 (constrain env)
@@ -174,7 +174,7 @@ constrainApp
175 -> IO Constraint
175 -> IO Constraint
176constrainApp env region f args tipe =
176constrainApp env region f args tipe =
177− do funcVar <- mkVar Nothing
177+ do funcVar <- mkFlexVar
178 funcCon <- constrain env f (VarN funcVar)
178 funcCon <- constrain env f (VarN funcVar)
180 (vars, argCons, numberOfArgsCons, argMatchCons, _, returnVar) <-
180 (vars, argCons, numberOfArgsCons, argMatchCons, _, returnVar) <-
@@ -210,10 +210,10 @@ argConstraints env name region totalArgs overallVar index args =
210 return ([], [], [], [], Nothing, overallVar)
210 return ([], [], [], [], Nothing, overallVar)
212 expr@(A.A subregion _) : rest ->
212 expr@(A.A subregion _) : rest ->
213− do argVar <- mkVar Nothing
213+ do argVar <- mkFlexVar
214 argCon <- constrain env expr (VarN argVar)
214 argCon <- constrain env expr (VarN argVar)
215− argIndexVar <- mkVar Nothing
215+ argIndexVar <- mkFlexVar
216− localReturnVar <- mkVar Nothing
216+ localReturnVar <- mkFlexVar
218 (vars, argConRest, numberOfArgsRest, argMatchRest, restRegion, returnVar) <-
218 (vars, argConRest, numberOfArgsRest, argMatchRest, restRegion, returnVar) <-
219 argConstraints env name region totalArgs localReturnVar (index + 1) rest
219 argConstraints env name region totalArgs localReturnVar (index + 1) rest
@@ -258,15 +258,15 @@ constrainBinop
259 -> IO Constraint
259 -> IO Constraint
260constrainBinop env region op leftExpr@(A.A leftRegion _) rightExpr@(A.A rightRegion _) tipe =
260constrainBinop env region op leftExpr@(A.A leftRegion _) rightExpr@(A.A rightRegion _) tipe =
261− do leftVar <- mkVar Nothing
261+ do leftVar <- mkFlexVar
262− rightVar <- mkVar Nothing
262+ rightVar <- mkFlexVar
264 leftCon <- constrain env leftExpr (VarN leftVar)
264 leftCon <- constrain env leftExpr (VarN leftVar)
265 rightCon <- constrain env rightExpr (VarN rightVar)
265 rightCon <- constrain env rightExpr (VarN rightVar)
267− leftVar' <- mkVar Nothing
267+ leftVar' <- mkFlexVar
268− rightVar' <- mkVar Nothing
268+ rightVar' <- mkFlexVar
269− answerVar <- mkVar Nothing
269+ answerVar <- mkFlexVar
271 let opType = VarN leftVar' ==> VarN rightVar' ==> VarN answerVar
271 let opType = VarN leftVar' ==> VarN rightVar' ==> VarN answerVar
@@ -295,7 +295,7 @@ constrainList env region exprs tipe =
295 return $ ex vars (CAnd (exprCons ++ cons))
295 return $ ex vars (CAnd (exprCons ++ cons))
297 elementConstraint expr@(A.A region' _) =
297 elementConstraint expr@(A.A region' _) =
298− do var <- mkVar Nothing
298+ do var <- mkFlexVar
299 con <- constrain env expr (VarN var)
299 con <- constrain env expr (VarN var)
300 return ( (var, region'), con )
300 return ( (var, region'), con )
@@ -328,17 +328,14 @@ constrainIf env region branches finally tipe =
329 return $ ex (condVars ++ vars) (CAnd (condCons ++ branchExprCons ++ cons))
329 return $ ex (condVars ++ vars) (CAnd (condCons ++ branchExprCons ++ cons))
334 constrainCondition condition@(A.A condRegion _) =
331 constrainCondition condition@(A.A condRegion _) =
335− do condVar <- mkVar Nothing
332+ do condVar <- mkFlexVar
336 condCon <- constrain env condition (VarN condVar)
333 condCon <- constrain env condition (VarN condVar)
337 let boolCon = CEqual Error.IfCondition condRegion (VarN condVar) bool
334 let boolCon = CEqual Error.IfCondition condRegion (VarN condVar) bool
338 return (condVar, CAnd [ condCon, boolCon ])
335 return (condVar, CAnd [ condCon, boolCon ])
340 constrainBranch expr@(A.A branchRegion _) =
337 constrainBranch expr@(A.A branchRegion _) =
341− do branchVar <- mkVar Nothing
338+ do branchVar <- mkFlexVar
342 exprCon <- constrain env expr (VarN branchVar)
339 exprCon <- constrain env expr (VarN branchVar)
344 ( (branchVar, branchRegion)
341 ( (branchVar, branchRegion)
@@ -374,7 +371,7 @@ constrainCase
375 -> IO Constraint
372 -> IO Constraint
376constrainCase env region expr branches tipe =
373constrainCase env region expr branches tipe =
377− do exprVar <- mkVar Nothing
374+ do exprVar <- mkFlexVar
378 exprCon <- constrain env expr (VarN exprVar)
375 exprCon <- constrain env expr (VarN exprVar)
380 (branchInfo, branchExprCons) <-
377 (branchInfo, branchExprCons) <-
@@ -385,7 +382,7 @@ constrainCase env region expr branches tipe =
385 return $ ex (exprVar : vars) (CAnd (exprCon : branchExprCons ++ cons))
382 return $ ex (exprVar : vars) (CAnd (exprCon : branchExprCons ++ cons))
387 branch patternType (pattern, branchExpr@(A.A branchRegion _)) =
384 branch patternType (pattern, branchExpr@(A.A branchRegion _)) =
388− do branchVar <- mkVar Nothing
385+ do branchVar <- mkFlexVar
389 scheme <- Pattern.infoToScheme <$> Pattern.constrain env pattern patternType
386 scheme <- Pattern.infoToScheme <$> Pattern.constrain env pattern patternType
390 branchCon <- constrain env branchExpr (VarN branchVar)
387 branchCon <- constrain env branchExpr (VarN branchVar)
@@ -422,7 +419,7 @@ pairCons region pairHint varToCon items =
423 case collectPairs 2 items of
420 case collectPairs 2 items of
424 Nothing ->
421 Nothing ->
425− do var <- mkVar Nothing
422+ do var <- mkFlexVar
426 return ([var], [varToCon var])
423 return ([var], [varToCon var])
428 Just (pairs, var) ->
425 Just (pairs, var) ->
@@ -519,7 +516,7 @@ constrainUnannotatedDef
520 -> IO Info
517 -> IO Info
521constrainUnannotatedDef env patternRegion name expr info =
518constrainUnannotatedDef env patternRegion name expr info =
522− do v <- mkVar Nothing
519+ do v <- mkFlexVar
523 let tipe = VarN v
520 let tipe = VarN v
524 defCon <- constrain env expr tipe
521 defCon <- constrain env expr tipe
525 return $ info
522 return $ info
@@ -592,7 +589,7 @@ constrainAnnDefHelp expr tipe (ArgInfo name defRegion env args vars) =
592 (Pattern.Info headers argVars argCons) <-
589 (Pattern.Info headers argVars argCons) <-
593 Pattern.joinInfos <$> mapM (uncurry (Pattern.constrain finalEnv)) finalArgs
590 Pattern.joinInfos <$> mapM (uncurry (Pattern.constrain finalEnv)) finalArgs
595− resultVar <- mkVar Nothing
592+ resultVar <- mkFlexVar
596 let resultType = VarN resultVar
593 let resultType = VarN resultVar
597 defCon <- constrain finalEnv expr resultType
594 defCon <- constrain finalEnv expr resultType