@@ -4,6 +4,7 @@ module Type.Unify (unify) where
44import Control.Monad (zipWithM_)
55import Control.Monad.Except (ExceptT, lift, liftIO, throwError, runExceptT)
66import qualified Data.Map as Map
7+import qualified Data.Maybe as Maybe
78import qualified Data.UnionFind.IO as UF
89
910import qualified AST.Variable as Var
@@ -616,7 +617,7 @@ unifyRecord context firstStructure secondStructure =
616617 -- looking into whether the particular field types match.
617618 let unifySharedFields otherFields ext =
618619 do let sharedFields = Map.intersectionWith (,) expFields actFields
619− _ <- traverse (uncurry (subUnify context)) sharedFields
620+ unifySharedFieldsHelp context sharedFields
620621 let allFields = Map.union (Map.map fst sharedFields) otherFields
621622 merge context (Structure (Record1 allFields ext))
622623
@@ -655,6 +656,29 @@ unifyRecord context firstStructure secondStructure =
655656
656657
657658
659+unifySharedFieldsHelp :: Context -> Map.Map String (Variable, Variable) -> Unify ()
660+unifySharedFieldsHelp context sharedFields =
661+ do maybeBadFields <- traverse (unifyField context) (Map.toList sharedFields)
662+ case Maybe.catMaybes maybeBadFields of
663+ [] ->
664+ return ()
665+
666+ badFields ->
667+ mismatch context (Just (Error.BadFields (reverse badFields)))
668+
669+
670+unifyField :: Context -> (String, (Variable, Variable)) -> Unify (Maybe String)
671+unifyField context (field, (expected, actual)) =
672+ do result <- lift $ runExceptT $ subUnify context expected actual
673+ case result of
674+ Right () ->
675+ return $ Nothing
676+
677+ Left _ ->
678+ return $ Just field
679+
680+
681+
658682-- GATHER RECORD STRUCTURE
659683
660684