@@ -13,14 +13,17 @@ import Guid
13import Types.Types
13import Types.Types
14import Types.Constrain
14import Types.Constrain
15import Types.Substitutions
15import Types.Substitutions
16+import Types.Alias (dealias)
17isSolved ss (C _ _ (t1 :=: t2)) = t1 == t2
18isSolved ss (C _ _ (t1 :=: t2)) = t1 == t2
18isSolved ss (C _ _ (x :<<: _)) = isJust (lookup x ss)
19isSolved ss (C _ _ (x :<<: _)) = isJust (lookup x ss)
19isSolved ss c = False
20isSolved ss c = False
22+type Aliases = Map.Map String ([X],Type)
21−crush :: Scheme -> GuidCounter (Either String Scheme)
24+crush :: Aliases -> Scheme -> GuidCounter (Either String Scheme)
22−crush (Forall xs cs t) =
25+crush aliases (Forall xs cs t) =
23− do subs <- solver cs Map.empty
26+ do subs <- solver aliases Map.empty cs
24 return $ do ss' <- subs
27 return $ do ss' <- subs
25 let ss = Map.toList ss'
28 let ss = Map.toList ss'
26 cs' = filter (not . isSolved ss) (subst ss cs)
29 cs' = filter (not . isSolved ss) (subst ss cs)
@@ -34,10 +37,11 @@ schemeSubHelp txt span x s t1 rltn t2 = do
34 | otherwise = do (st, cs) <- concretize s
37 | otherwise = do (st, cs) <- concretize s
35 return (subst [(x,st)] t, cs)
38 return (subst [(x,st)] t, cs)
37−schemeSub x s c = do s' <- crush s
40+schemeSub aliases x s c =
41+ do s' <- crush aliases s
38− case s' of
42+ case s' of
39− Right s'' -> Right `liftM` schemeSub' x s'' c
43+ Right s'' -> Right `liftM` schemeSub' x s'' c
40− Left err -> return $ Left err
44+ Left err -> return $ Left err
42schemeSub' x s c@(C txt span constraint) =
46schemeSub' x s c@(C txt span constraint) =
43 case constraint of
47 case constraint of
@@ -77,29 +81,34 @@ recordConstraints eq fs t fs' t' =
77 let tipe = RecordT (Map.singleton k bs) (VarT x)
81 let tipe = RecordT (Map.singleton k bs) (VarT x)
78 return (cs ++ [eq t tipe])
82 return (cs ++ [eq t tipe])
80−solver :: [Context Constraint]
84+solver :: Aliases
81 -> Map.Map X Type
85 -> Map.Map X Type
86+ -> [Context Constraint]
82 -> GuidCounter (Either String (Map.Map X Type))
87 -> GuidCounter (Either String (Map.Map X Type))
83−solver [] subs = return $ Right subs
88+solver _ subs [] = return $ Right subs
84−solver (C txt span c : cs) subs =
89+solver aliases subs (C txt span c : cs) =
85 let ctx = C txt span
90 let ctx = C txt span
86 eq t1 t2 = ctx (t1 :=: t2)
91 eq t1 t2 = ctx (t1 :=: t2)
92+ solv = solver aliases subs
87 in case c of
93 in case c of
88 -- Destruct Type-constructors
94 -- Destruct Type-constructors
89 t1@(ADT n1 ts1) :=: t2@(ADT n2 ts2) ->
95 t1@(ADT n1 ts1) :=: t2@(ADT n2 ts2) ->
90− if n1 /= n2 then uniError txt span t1 t2 else
91− solver (zipWith eq ts1 ts2 ++ cs) subs
96+ if n1 == n2 then solv (zipWith eq ts1 ts2 ++ cs)
97+ else let t1' = dealias aliases t1
98+ t2' = dealias aliases t2
99+ in if t1 == t1' && t2 == t2' then uniError txt span t1 t2
100+ else solv (ctx (t1' :=: t2') : cs)
93 LambdaT t1 t2 :=: LambdaT t1' t2' ->
102 LambdaT t1 t2 :=: LambdaT t1' t2' ->
94− solver ([ eq t1 t1', eq t2 t2' ] ++ cs) subs
103+ solv ([ eq t1 t1', eq t2 t2' ] ++ cs)
96 RecordT fs t :=: RecordT fs' t' ->
105 RecordT fs t :=: RecordT fs' t' ->
97 do cs' <- recordConstraints eq fs t fs' t'
106 do cs' <- recordConstraints eq fs t fs' t'
98− solver (cs' ++ cs) subs
107+ solv (cs' ++ cs)
100 -- Type-equality
109 -- Type-equality
101 VarT x :=: VarT y
110 VarT x :=: VarT y
102− | x == y -> solver cs subs
111+ | x == y -> solv cs
103 | otherwise ->
112 | otherwise ->
104 case (Map.lookup x subs, Map.lookup y subs) of
113 case (Map.lookup x subs, Map.lookup y subs) of
105 (Just (Super xts), Just (Super yts)) ->
114 (Just (Super xts), Just (Super yts)) ->
@@ -108,68 +117,68 @@ solver (C txt span c : cs) subs =
108 in case Set.toList ts of
117 in case Set.toList ts of
109 [] -> unionError txt span xts yts
118 [] -> unionError txt span xts yts
110 [t] -> let cs1 = subst [(x,t),(y,t)] cs in
119 [t] -> let cs1 = subst [(x,t),(y,t)] cs in
111− cs1 `seq` solver cs1 (setXY t subs)
120+ cs1 `seq` solver aliases (setXY t subs) cs1
112− _ -> solver cs $ setXY (Super ts) subs
121+ _ -> solver aliases (setXY (Super ts) subs) cs
113 (Just (Super xts), _) ->
122 (Just (Super xts), _) ->
114 let cs2 = subst [(y,VarT x)] cs in
123 let cs2 = subst [(y,VarT x)] cs in
115− solver cs2 $ Map.insert y (VarT x) subs
124+ solver aliases (Map.insert y (VarT x) subs) cs2
116 (_, _) ->
125 (_, _) ->
117 let cs3 = subst [(x,VarT y)] cs in
126 let cs3 = subst [(x,VarT y)] cs in
118− solver cs3 $ Map.insert x (VarT y) subs
127+ solver aliases (Map.insert x (VarT y) subs) cs3
120 VarT x :=: t -> do
129 VarT x :=: t -> do
121 if x `occurs` t then occursError txt span (VarT x) t else
130 if x `occurs` t then occursError txt span (VarT x) t else
122 (case Map.lookup x subs of
131 (case Map.lookup x subs of
123− Nothing -> let cs4 = subst [(x,t)] cs in
133+ let cs4 = subst [(x,t)] cs
124− solver cs4 . Map.map (subst [(x,t)]) $
125− Map.insert x t subs
134+ subs' = Map.map (subst [(x,t)]) $ Map.insert x t subs
135+ in solver aliases subs' cs4
126 Just (Super ts) ->
136 Just (Super ts) ->
127 let ts' = Set.intersection ts (Set.singleton t) in
137 let ts' = Set.intersection ts (Set.singleton t) in
128 case Set.toList ts' of
138 case Set.toList ts' of
129− [] -> solver (ctx (t :<: Super ts) : cs) subs
139+ [] -> solv (ctx (t :<: Super ts) : cs)
130 [t'] -> let cs5 = subst [(x,t)] cs in
140 [t'] -> let cs5 = subst [(x,t)] cs in
131− solver cs5 $ Map.insert x t' subs
141+ solver aliases (Map.insert x t' subs) cs5
132− _ -> solver cs $ Map.insert x (Super ts') subs
142+ _ -> solver aliases (Map.insert x (Super ts') subs) cs
133− Just t' -> solver (ctx (t' :=: t) : cs) subs
143+ Just t' -> solv (ctx (t' :=: t) : cs)
136− t :=: VarT x -> solver ((ctx (VarT x :=: t)) : cs) subs
146+ t :=: VarT x -> solv ((ctx (VarT x :=: t)) : cs)
138− t1 :=: t2 | t1 == t2 -> solver cs subs
148+ t1 :=: t2 | t1 == t2 -> solv cs
139 | otherwise -> uniError txt span t1 t2
149 | otherwise -> uniError txt span t1 t2
141 -- subtypes
151 -- subtypes
142 VarT x :<: Super ts ->
152 VarT x :<: Super ts ->
143 case Map.lookup x subs of
153 case Map.lookup x subs of
144− Nothing -> solver cs $ Map.insert x (Super ts) subs
154+ Nothing -> solver aliases (Map.insert x (Super ts) subs) cs
145 Just (Super ts') ->
155 Just (Super ts') ->
146 case Set.toList $ Set.intersection ts ts' of
156 case Set.toList $ Set.intersection ts ts' of
147 [] -> unionError txt span ts ts'
157 [] -> unionError txt span ts ts'
148− [t] -> solver (subst [(x,t)] cs) $ Map.insert x t subs
158+ [t] -> solver aliases (Map.insert x t subs) (subst [(x,t)] cs)
149− ts'' -> solver cs $
159+ ts'' -> solver aliases subs' cs
150− Map.insert x (Super $ Set.fromList ts'') subs
160+ where subs' = Map.insert x (Super $ Set.fromList ts'') subs
152 ADT "List" [t] :<: Super ts
162 ADT "List" [t] :<: Super ts
153− | any f (Set.toList ts) -> solver cs subs
163+ | any f (Set.toList ts) -> solv cs
154 | otherwise -> subtypeError txt span (ADT "List" [t]) (Super ts)
164 | otherwise -> subtypeError txt span (ADT "List" [t]) (Super ts)
155 where f (ADT "List" [VarT _]) = True
165 where f (ADT "List" [VarT _]) = True
156 f (ADT "List" [t']) = t == t'
166 f (ADT "List" [t']) = t == t'
157 f _ = False
167 f _ = False
159 t :<: Super ts
169 t :<: Super ts
160− | Set.member t ts -> solver cs subs
170+ | Set.member t ts -> solv cs
161 | otherwise -> subtypeError txt span t (Super ts)
171 | otherwise -> subtypeError txt span t (Super ts)
164 | any (occurs x) cs ->
174 | any (occurs x) cs ->
165− do css <- mapM (schemeSub x s) cs
175+ do css <- mapM (schemeSub aliases x s) cs
166 case lefts css of
176 case lefts css of
167 err : _ -> return $ Left err
177 err : _ -> return $ Left err
168− [] -> solver (concat (rights css)) subs
178+ [] -> solv (concat (rights css))
169 | otherwise ->
179 | otherwise ->
170 do (t,cs7) <- concretize s
180 do (t,cs7) <- concretize s
171− let cs'' = (cs ++ ctx (VarT x :=: t) : cs7)
181+ solv (cs ++ ctx (VarT x :=: t) : cs7)
174showMsg msg = case msg of
183showMsg msg = case msg of
175 Just str -> "\nIn context: " ++ str
184 Just str -> "\nIn context: " ++ str