@@ -108,31 +108,24 @@ constrain env (L _ _ expr) tipe =
108108
109109 Modify e fields ->
110110 exists $ \t -> do
111− dummyFields <- Map.fromList <$> mapM dummyField fields
112− cOld <- constrain env e (record dummyFields t)
113− (fieldTypes, constraints) <- unzip <$> mapM field fields
114− let cNew = tipe === record (Map.fromList fieldTypes) t
115− return (CAnd (cOld : cNew : constraints))
116− where
117− dummyField (label, _) = do
118− v <- var Flexible -- needs an ex
119− return (label, [VarN v])
111+ oldVars <- forM fields $ \_ -> var Flexible
112+ let oldFields = SrcT.fieldMap (zip (map fst fields) (map VarN oldVars))
113+ cOld <- ex oldVars <$> constrain env e (record oldFields t)
114+
115+ newVars <- forM fields $ \_ -> var Flexible
116+ let newFields = SrcT.fieldMap (zip (map fst fields) (map VarN newVars))
117+ let cNew = tipe === record newFields t
120118
121− field (label, value) = do
122− v <- var Flexible -- needs an ex
123− c <- ex [v] <$> constrain env value (VarN v)
124− return ((label, [VarN v]), c)
119+ cs <- zipWithM (constrain env) (map snd fields) (map VarN newVars)
120+
121+ return $ cOld /\ ex newVars (CAnd (cNew : cs))
125122
126123 Record fields ->
127− do (pairs, cs) <- unzip <$> mapM field fields
128− let fieldTypes = Map.fromList (map (second (\t -> [VarN t])) pairs)
129− recordType = record fieldTypes (TermN EmptyRecord1)
130− return $ ex (map snd pairs) (CAnd (tipe === recordType : cs))
131− where
132− field (name, body) = do
133− v <- var Flexible -- needs an ex
134− c <- constrain env body (VarN v)
135− return ((name, v), c)
124+ do vars <- forM fields $ \_ -> var Flexible
125+ cs <- zipWithM (constrain env) (map snd fields) (map VarN vars)
126+ let fields' = SrcT.fieldMap (zip (map fst fields) (map VarN vars))
127+ recordType = record fields' (TermN EmptyRecord1)
128+ return . ex vars $ CAnd (tipe === recordType : cs)
136129
137130 Markdown _ ->
138131 return $ tipe === Env.get env Env.types "Element"