on master help sign in
Correct the code that unifies records
fd63affEvan Czaplicki
compiler/Type/Unify.hs+13−7
@@ -127,19 +127,25 @@ actuallyUnify variable1 variable2 = do
127
127
128 (Record1 fields1 ext1, Record1 fields2 ext2) ->
128 (Record1 fields1 ext1, Record1 fields2 ext2) ->
129 do sequence . concat . Map.elems $ Map.intersectionWith (zipWith unify) fields1 fields2
129 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
132 case (Map.null fields1', Map.null fields2') of
131 case (Map.null fields1', Map.null fields2') of
133 (True , True ) -> unify ext1 ext2
132 (True , True ) -> unify ext1 ext2
133+ (True , False) -> do
134+ record2' <- mkRecord fields2' ext2
134− (True , False) -> unify ext1 record2'
135+ unify ext1 record2'
136+ (False, True ) -> do
137+ record1' <- mkRecord fields1' ext1
135− (False, True ) -> unify record1' ext2
138+ unify record1' ext2
136− (False, False) -> do unify ext1 record2'
139+ (False, False) -> do
140+ record1' <- mkRecord fields1' =<< liftIO (var Flexible)
141+ record2' <- mkRecord fields2' =<< liftIO (var Flexible)
137− unify record1' ext2
142+ unify record1' ext2
143+ unify ext1 record2'
138 where
144 where
139 fields1' = unmerged fields1 fields2
145 fields1' = unmerged fields1 fields2
140 fields2' = unmerged fields2 fields1
146 fields2' = unmerged fields2 fields1
141
147
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
143
149
144 eat (x:xs) (y:ys) = eat xs ys
150 eat (x:xs) (y:ys) = eat xs ys
145 eat xs ys = xs
151 eat xs ys = xs