@@ -4,6 +4,7 @@ module Type.Unify (unify) where
4import Control.Monad (zipWithM_)
4import Control.Monad (zipWithM_)
5import Control.Monad.Except (ExceptT, lift, liftIO, throwError, runExceptT)
5import Control.Monad.Except (ExceptT, lift, liftIO, throwError, runExceptT)
6import qualified Data.Map as Map
6import qualified Data.Map as Map
7+import qualified Data.Maybe as Maybe
7import qualified Data.UnionFind.IO as UF
8import qualified Data.UnionFind.IO as UF
9import qualified AST.Variable as Var
10import qualified AST.Variable as Var
@@ -616,7 +617,7 @@ unifyRecord context firstStructure secondStructure =
616 -- looking into whether the particular field types match.
617 -- looking into whether the particular field types match.
617 let unifySharedFields otherFields ext =
618 let unifySharedFields otherFields ext =
618 do let sharedFields = Map.intersectionWith (,) expFields actFields
619 do let sharedFields = Map.intersectionWith (,) expFields actFields
619− _ <- traverse (uncurry (subUnify context)) sharedFields
620+ unifySharedFieldsHelp context sharedFields
620 let allFields = Map.union (Map.map fst sharedFields) otherFields
621 let allFields = Map.union (Map.map fst sharedFields) otherFields
621 merge context (Structure (Record1 allFields ext))
622 merge context (Structure (Record1 allFields ext))
@@ -655,6 +656,29 @@ unifyRecord context firstStructure secondStructure =
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
667+ mismatch context (Just (Error.BadFields (reverse badFields)))
670+unifyField :: Context -> (String, (Variable, Variable)) -> Unify (Maybe String)
671+unifyField context (field, (expected, actual)) =
672+ do result <- lift $ runExceptT $ subUnify context expected actual
658-- GATHER RECORD STRUCTURE
682-- GATHER RECORD STRUCTURE