@@ -74,15 +74,7 @@ constrain env (A.A region expression) tipe =
7474 constrainList env region exprs tipe
7575
7676 E.Binop op leftExpr rightExpr ->
77− exists $ \leftType ->
78− exists $ \rightType ->
79− do leftCon <- constrain env leftExpr leftType
80− rightCon <- constrain env rightExpr rightType
81− return $ CAnd
82− [ leftCon
83− , rightCon
84− , V.toString op <? (leftType ==> rightType ==> tipe)
85− ]
77+ constrainBinop env region op leftExpr rightExpr tipe
8678
8779 E.Lambda pattern body ->
8880 exists $ \argType ->
@@ -188,6 +180,40 @@ constrain env (A.A region expression) tipe =
188180 constrain env expr tipe
189181
190182
183+-- CONSTRAIN BINOP
184+
185+constrainBinop
186+ :: Env.Environment
187+ -> R.Region
188+ -> V.Canonical
189+ -> Canonical.Expr
190+ -> Canonical.Expr
191+ -> Type
192+ -> IO TypeConstraint
193+constrainBinop env region op leftExpr@(A.A leftRegion _) rightExpr@(A.A rightRegion _) tipe =
194+ do leftVar <- variable Flexible
195+ rightVar <- variable Flexible
196+
197+ leftCon <- constrain env leftExpr (varN leftVar)
198+ rightCon <- constrain env rightExpr (varN rightVar)
199+
200+ leftVar' <- variable Flexible
201+ rightVar' <- variable Flexible
202+ answerVar <- variable Flexible
203+
204+ let opType = varN leftVar' ==> varN rightVar' ==> varN answerVar
205+
206+ return $
207+ ex [leftVar,rightVar,leftVar',rightVar',answerVar] $ CAnd $
208+ [ leftCon
209+ , rightCon
210+ , CInstance region (V.toString op) opType
211+ , CEqual (Error.BinopLeft op leftRegion) region (varN leftVar') (varN leftVar)
212+ , CEqual (Error.BinopRight op rightRegion) region (varN rightVar') (varN rightVar)
213+ , CEqual (Error.Binop op) region tipe (varN answerVar)
214+ ]
215+
216+
191217-- CONSTRAIN LISTS
192218
193219constrainList