@@ -88,14 +88,20 @@ constrain env (A.A region expression) tipe =
89 return $ con /\ tipe === (argType ==> resType)
89 return $ con /\ tipe === (argType ==> resType)
91− E.App func arg ->
91+ E.App func arg@(A.A argRegion _) ->
92 do argVar <- variable Flexible
92 do argVar <- variable Flexible
93− resultVar <- variable Flexible
94 argCon <- constrain env arg (varN argVar)
93 argCon <- constrain env arg (varN argVar)
95+ argVar' <- variable Flexible
96+ resultVar <- variable Flexible
95− funcCon <- constrain env func (varN argVar ==> varN resultVar)
97+ funcCon <- constrain env func (varN argVar' ==> varN resultVar)
96− let appCon = tipe === varN resultVar
98+
98− ex [argVar,resultVar] (CAnd [ argCon, funcCon, appCon ])
99+ return $ ex [argVar,argVar',resultVar] $ CAnd $
102+ , CEqual (Error.Argument argRegion) region (varN argVar') (varN argVar)
103+ , tipe === varN resultVar
100 E.MultiIf branches ->
106 E.MultiIf branches ->
101 constrainIf env region branches tipe
107 constrainIf env region branches tipe