@@ -89,30 +89,32 @@ adjustRank youngMark visitedMark groupRank variable =
92−solve :: TypeConstraint -> StateT TS.SolverState IO (Map.Map String Variable)
92+solve :: TypeConstraint -> StateT TS.SolverState IO ()
93solve constraint =
93solve constraint =
94 case constraint of
94 case constraint of
95− CTrue -> TS.getEnv
95+ CTrue -> return ()
97+ CSaveEnv -> TS.saveLocalEnv
97 CEqual term1 term2 -> do
99 CEqual term1 term2 -> do
98 t1 <- TS.flatten term1
100 t1 <- TS.flatten term1
99 t2 <- TS.flatten term2
101 t2 <- TS.flatten term2
100 unify t1 t2
102 unify t1 t2
103− CAnd cs -> mapM solve cs >> TS.getEnv
104+ CAnd cs -> mapM_ solve cs
105 CLet [Scheme [] fqs constraint' _] CTrue -> do
106 CLet [Scheme [] fqs constraint' _] CTrue -> do
106 oldEnv <- TS.getEnv
107 oldEnv <- TS.getEnv
107 mapM TS.introduce fqs
108 mapM TS.introduce fqs
108 solve constraint'
109 solve constraint'
109 TS.modifyEnv (\_ -> oldEnv)
110 TS.modifyEnv (\_ -> oldEnv)
112 CLet schemes constraint' -> do
112 CLet schemes constraint' -> do
113 headers <- mapM solveScheme schemes
114 headers <- mapM solveScheme schemes
114 TS.modifyEnv $ \env -> Map.unions (headers ++ [env])
115 TS.modifyEnv $ \env -> Map.unions (headers ++ [env])
115 solve constraint'
116 solve constraint'
117+ TS.modifyEnv (\_ -> oldEnv)
117 CInstance name term -> do
119 CInstance name term -> do
118 env <- TS.getEnv
120 env <- TS.getEnv
@@ -120,7 +122,6 @@ solve constraint =
120 freshCopy <- TS.makeInstance (Map.findWithDefault (error msg) name env)
122 freshCopy <- TS.makeInstance (Map.findWithDefault (error msg) name env)
121 t <- TS.flatten term
123 t <- TS.flatten term
122 unify freshCopy t
124 unify freshCopy t
125solveScheme :: TypeScheme -> StateT TS.SolverState IO (Map.Map String Variable)
126solveScheme :: TypeScheme -> StateT TS.SolverState IO (Map.Map String Variable)
126solveScheme scheme =
127solveScheme scheme =