@@ -4,11 +4,11 @@ module Type.Solve where
4import Control.Monad
4import Control.Monad
5import qualified Data.UnionFind.IO as UF
5import qualified Data.UnionFind.IO as UF
6import qualified Data.Array.IO as Array
6import qualified Data.Array.IO as Array
7−import qualified Data.Map as Map
7+import Data.Map as Map
8import qualified Data.Maybe as Maybe
8import qualified Data.Maybe as Maybe
9import Type.Type
9import Type.Type
10import Type.Unify
10import Type.Unify
11−import Type.Environment
11+import Type.Environment as Env
14-- Holds a bunch of variables
14-- Holds a bunch of variables
@@ -88,6 +88,11 @@ traverse young visited k variable =
89success = return []
89success = return []
91solve env pool constraint =
96solve env pool constraint =
92 case constraint of
97 case constraint of
93 CTrue -> success
98 CTrue -> success
@@ -100,12 +105,33 @@ solve env pool constraint =
100 return (concat results)
105 return (concat results)
102 CLet schemes constraint' -> do
107 CLet schemes constraint' -> do
103− env' <- foldM (\env' scheme -> (++) env' `liftM` solveScheme env pool scheme) env schemes
108+ env' <- foldM (\env' scheme -> addTo env' `liftM` solveScheme env pool scheme) env schemes
104 solve env' pool constraint'
109 solve env' pool constraint'
106 CInstance name term -> do
111 CInstance name term -> do
112+ let instance' = undefined
107− let inst = instance' pool (Env.get env value name)
113+ inst = instance' pool (Env.get env value name)
108− t = chop pool term
114+ t <- chop pool term
109 unify pool inst t
115 unify pool inst t
117+solveScheme env pool scheme =
119+ Scheme [] [] constraint header -> do
120+ solve env pool constraint
121+ mapM (\(n,t) -> (,) n `liftM` chop pool t) (Map.toList header)
123+ Scheme rigidQuantifiers flexibleQuantifiers constraint header -> do
124+ let quantifiers = rigidQuantifiers ++ flexibleQuantifiers
125+ pool' <- newPool pool
126+ mapM (introduce pool') rigidQuantifiers
127+ mapM (introduce pool') flexibleQuantifiers
128+ header' <- mapM (\(n,t) -> (,) n `liftM` chop pool t) (Map.toList header)
129+ solve env pool' constraint
130+ generalize pool pool'
131+ mapM isGeneric rigidQuantifiers
135+ do desc <- UF.descriptor var
111−solveScheme = undefined
136+ undefined