@@ -127,19 +127,25 @@ actuallyUnify variable1 variable2 = do
127127
128128 (Record1 fields1 ext1, Record1 fields2 ext2) ->
129129 do sequence . concat . Map.elems $ Map.intersectionWith (zipWith unify) fields1 fields2
130− record1' <- liftIO $ (structuredVar . Record1 fields1') =<< var Flexible
131− record2' <- liftIO $ (structuredVar . Record1 fields2') =<< var Flexible
130+ let mkRecord fs ext = liftIO . structuredVar $ Record1 fs ext
132131 case (Map.null fields1', Map.null fields2') of
133132 (True , True ) -> unify ext1 ext2
134− (True , False) -> unify ext1 record2'
135− (False, True ) -> unify record1' ext2
136− (False, False) -> do unify ext1 record2'
137− unify record1' ext2
133+ (True , False) -> do
134+ record2' <- mkRecord fields2' ext2
135+ unify ext1 record2'
136+ (False, True ) -> do
137+ record1' <- mkRecord fields1' ext1
138+ unify record1' ext2
139+ (False, False) -> do
140+ record1' <- mkRecord fields1' =<< liftIO (var Flexible)
141+ record2' <- mkRecord fields2' =<< liftIO (var Flexible)
142+ unify record1' ext2
143+ unify ext1 record2'
138144 where
139145 fields1' = unmerged fields1 fields2
140146 fields2' = unmerged fields2 fields1
141147
142− unmerged a b = Map.filter (not . null) $ Map.unionWith eat a b
148+ unmerged a b = Map.filter (not . null) $ Map.union (Map.intersectionWith eat a b) a
143149
144150 eat (x:xs) (y:ys) = eat xs ys
145151 eat xs ys = xs