@@ -22,10 +22,16 @@ import qualified Transform.SortDefinitions as SD
24constrain :: Env.Environment -> LExpr a b -> Type -> IO TypeConstraint
24constrain :: Env.Environment -> LExpr a b -> Type -> IO TypeConstraint
25−constrain env (L _ expr) tipe =
25+constrain env (L span expr) tipe =
26− let list t = Env.get env Env.types "_List" <| t in
26+ let list t = Env.get env Env.types "_List" <| t
29+ t1 === t2 = L span (CEqual t1 t2)
30+ x <? t = L span (CInstance x t)
31+ clet schemes c = L span (CLet schemes c)
27 case expr of
33 case expr of
28− Literal lit -> Literal.constrain env lit tipe
34+ Literal lit -> Literal.constrain env span lit tipe
30 Var name -> return (name <? tipe)
36 Var name -> return (name <? tipe)
@@ -33,26 +39,26 @@ constrain env (L _ expr) tipe =
33 exists $ \x -> do
39 exists $ \x -> do
34 clo <- constrain env lo x
40 clo <- constrain env lo x
35 chi <- constrain env hi x
41 chi <- constrain env hi x
36− return $ CAnd [clo, chi, list x === tipe]
42+ return $ and [clo, chi, list x === tipe]
38 ExplicitList exprs ->
44 ExplicitList exprs ->
39 exists $ \x -> do
45 exists $ \x -> do
40 cs <- mapM (\e -> constrain env e x) exprs
46 cs <- mapM (\e -> constrain env e x) exprs
41− return $ CAnd (list x === tipe : cs)
47+ return . and $ list x === tipe : cs
43 Binop op e1 e2 ->
49 Binop op e1 e2 ->
44 exists $ \t1 ->
50 exists $ \t1 ->
45 exists $ \t2 -> do
51 exists $ \t2 -> do
46 c1 <- constrain env e1 t1
52 c1 <- constrain env e1 t1
47 c2 <- constrain env e2 t2
53 c2 <- constrain env e2 t2
48− return $ CAnd [ c1, c2, op <? (t1 ==> t2 ==> tipe) ]
54+ return $ and [ c1, c2, op <? (t1 ==> t2 ==> tipe) ]
50 Lambda p e ->
56 Lambda p e ->
51 exists $ \t1 ->
57 exists $ \t1 ->
52 exists $ \t2 -> do
58 exists $ \t2 -> do
53 fragment <- Pattern.constrain env p t1
59 fragment <- Pattern.constrain env p t1
54 c2 <- constrain env e t2
60 c2 <- constrain env e t2
55− let c = ex (vars fragment) (CLet [monoscheme (typeEnv fragment)]
61+ let c = ex (vars fragment) (clet [monoscheme (typeEnv fragment)]
56 (typeConstraint fragment /\ c2 ))
62 (typeConstraint fragment /\ c2 ))
57 return $ c /\ tipe === (t1 ==> t2)
63 return $ c /\ tipe === (t1 ==> t2)
@@ -62,7 +68,7 @@ constrain env (L _ expr) tipe =
62 c2 <- constrain env e2 t
68 c2 <- constrain env e2 t
63 return $ c1 /\ c2
69 return $ c1 /\ c2
65− MultiIf branches -> CAnd <$> mapM constrain' branches
71+ MultiIf branches -> and <$> mapM constrain' branches
67 bool = Env.get env Env.types "Bool"
73 bool = Env.get env Env.types "Bool"
68 constrain' (b,e) = do
74 constrain' (b,e) = do
@@ -75,12 +81,12 @@ constrain env (L _ expr) tipe =
75 ce <- constrain env exp t
81 ce <- constrain env exp t
76 let branch (p,e) = do
82 let branch (p,e) = do
77 fragment <- Pattern.constrain env p t
83 fragment <- Pattern.constrain env p t
78− CLet [toScheme fragment] <$> constrain env e tipe
84+ clet [toScheme fragment] <$> constrain env e tipe
79− CAnd . (:) ce <$> mapM branch branches
85+ and . (:) ce <$> mapM branch branches
81 Data name exprs ->
87 Data name exprs ->
82 do pairs <- mapM pair exprs
88 do pairs <- mapM pair exprs
83− (ctipe, cs) <- Monad.foldM step (tipe,CTrue) (reverse pairs)
89+ (ctipe, cs) <- Monad.foldM step (tipe,true) (reverse pairs)
84 return (cs /\ name <? ctipe)
90 return (cs /\ name <? ctipe)
86 pair e = do v <- var Flexible -- needs an ex
92 pair e = do v <- var Flexible -- needs an ex
@@ -104,7 +110,7 @@ constrain env (L _ expr) tipe =
104 cVal <- constrain env value tVal
110 cVal <- constrain env value tVal
105 cRec <- constrain env e tRec
111 cRec <- constrain env e tRec
106 let c = tipe === record (Map.singleton label [tVal]) tRec
112 let c = tipe === record (Map.singleton label [tVal]) tRec
107− return (CAnd [cVal, cRec, c])
113+ return (and [cVal, cRec, c])
109 Modify e fields ->
115 Modify e fields ->
110 exists $ \t -> do
116 exists $ \t -> do
@@ -118,28 +124,28 @@ constrain env (L _ expr) tipe =
119 cs <- zipWithM (constrain env) (map snd fields) (map VarN newVars)
125 cs <- zipWithM (constrain env) (map snd fields) (map VarN newVars)
121− return $ cOld /\ ex newVars (CAnd (cNew : cs))
127+ return $ cOld /\ ex newVars (and (cNew : cs))
123 Record fields ->
129 Record fields ->
124 do vars <- forM fields $ \_ -> var Flexible
130 do vars <- forM fields $ \_ -> var Flexible
125 cs <- zipWithM (constrain env) (map snd fields) (map VarN vars)
131 cs <- zipWithM (constrain env) (map snd fields) (map VarN vars)
126 let fields' = SrcT.fieldMap (zip (map fst fields) (map VarN vars))
132 let fields' = SrcT.fieldMap (zip (map fst fields) (map VarN vars))
127 recordType = record fields' (TermN EmptyRecord1)
133 recordType = record fields' (TermN EmptyRecord1)
128− return . ex vars $ CAnd (tipe === recordType : cs)
134+ return . ex vars . and $ tipe === recordType : cs
130 Markdown _ ->
136 Markdown _ ->
131 return $ tipe === Env.get env Env.types "Element"
137 return $ tipe === Env.get env Env.types "Element"
133 Let defs body ->
139 Let defs body ->
134 do c <- case body of
140 do c <- case body of
135− L _ (Var name) | name == saveEnvName -> return CSaveEnv
141+ L _ (Var name) | name == saveEnvName -> return (L span CSaveEnv)
136 _ -> constrain env body tipe
142 _ -> constrain env body tipe
137 (schemes, rqs, fqs, header, c2, c1) <-
143 (schemes, rqs, fqs, header, c2, c1) <-
138 Monad.foldM (constrainDef env)
144 Monad.foldM (constrainDef env)
139− ([], [], [], Map.empty, CTrue, CTrue)
145+ ([], [], [], Map.empty, true, true)
140 (collapseDefs defs)
146 (collapseDefs defs)
141− return $ CLet schemes
147+ return $ clet schemes
142− (CLet [Scheme rqs fqs (CLet [monoscheme header] c2) header ]
148+ (clet [Scheme rqs fqs (clet [monoscheme header] c2) header ]
143 (c1 /\ c))
149 (c1 /\ c))
145constrainDef env info (pattern, expr, maybeTipe) =
151constrainDef env info (pattern, expr, maybeTipe) =
@@ -154,7 +160,7 @@ constrainDef env info (pattern, expr, maybeTipe) =
154 (vars, typ) <- Env.instantiateType env tipe Map.empty
160 (vars, typ) <- Env.instantiateType env tipe Map.empty
155 let scheme = Scheme { rigidQuantifiers = [],
161 let scheme = Scheme { rigidQuantifiers = [],
156 flexibleQuantifiers = flexiVars ++ vars,
162 flexibleQuantifiers = flexiVars ++ vars,
157− constraint = CTrue,
163+ constraint = Loc.none CTrue,
158 header = Map.singleton name typ }
164 header = Map.singleton name typ }
159 c <- constrain env' expr typ
165 c <- constrain env' expr typ
160 return ( scheme : schemes
166 return ( scheme : schemes