@@ -22,10 +22,16 @@ import qualified Transform.SortDefinitions as SD
2222
2323
2424constrain :: Env.Environment -> LExpr a b -> Type -> IO TypeConstraint
25−constrain env (L _ expr) tipe =
26− let list t = Env.get env Env.types "_List" <| t in
25+constrain env (L span expr) tipe =
26+ let list t = Env.get env Env.types "_List" <| t
27+ and = L span . CAnd
28+ true = L span CTrue
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)
32+ in
2733 case expr of
28− Literal lit -> Literal.constrain env lit tipe
34+ Literal lit -> Literal.constrain env span lit tipe
2935
3036 Var name -> return (name <? tipe)
3137
@@ -33,26 +39,26 @@ constrain env (L _ expr) tipe =
3339 exists $ \x -> do
3440 clo <- constrain env lo x
3541 chi <- constrain env hi x
36− return $ CAnd [clo, chi, list x === tipe]
42+ return $ and [clo, chi, list x === tipe]
3743
3844 ExplicitList exprs ->
3945 exists $ \x -> do
4046 cs <- mapM (\e -> constrain env e x) exprs
41− return $ CAnd (list x === tipe : cs)
47+ return . and $ list x === tipe : cs
4248
4349 Binop op e1 e2 ->
4450 exists $ \t1 ->
4551 exists $ \t2 -> do
4652 c1 <- constrain env e1 t1
4753 c2 <- constrain env e2 t2
48− return $ CAnd [ c1, c2, op <? (t1 ==> t2 ==> tipe) ]
54+ return $ and [ c1, c2, op <? (t1 ==> t2 ==> tipe) ]
4955
5056 Lambda p e ->
5157 exists $ \t1 ->
5258 exists $ \t2 -> do
5359 fragment <- Pattern.constrain env p t1
5460 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)]
5662 (typeConstraint fragment /\ c2 ))
5763 return $ c /\ tipe === (t1 ==> t2)
5864
@@ -62,7 +68,7 @@ constrain env (L _ expr) tipe =
6268 c2 <- constrain env e2 t
6369 return $ c1 /\ c2
6470
65− MultiIf branches -> CAnd <$> mapM constrain' branches
71+ MultiIf branches -> and <$> mapM constrain' branches
6672 where
6773 bool = Env.get env Env.types "Bool"
6874 constrain' (b,e) = do
@@ -75,12 +81,12 @@ constrain env (L _ expr) tipe =
7581 ce <- constrain env exp t
7682 let branch (p,e) = do
7783 fragment <- Pattern.constrain env p t
78− CLet [toScheme fragment] <$> constrain env e tipe
79− CAnd . (:) ce <$> mapM branch branches
84+ clet [toScheme fragment] <$> constrain env e tipe
85+ and . (:) ce <$> mapM branch branches
8086
8187 Data name exprs ->
8288 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)
8490 return (cs /\ name <? ctipe)
8591 where
8692 pair e = do v <- var Flexible -- needs an ex
@@ -104,7 +110,7 @@ constrain env (L _ expr) tipe =
104110 cVal <- constrain env value tVal
105111 cRec <- constrain env e tRec
106112 let c = tipe === record (Map.singleton label [tVal]) tRec
107− return (CAnd [cVal, cRec, c])
113+ return (and [cVal, cRec, c])
108114
109115 Modify e fields ->
110116 exists $ \t -> do
@@ -118,28 +124,28 @@ constrain env (L _ expr) tipe =
118124
119125 cs <- zipWithM (constrain env) (map snd fields) (map VarN newVars)
120126
121− return $ cOld /\ ex newVars (CAnd (cNew : cs))
127+ return $ cOld /\ ex newVars (and (cNew : cs))
122128
123129 Record fields ->
124130 do vars <- forM fields $ \_ -> var Flexible
125131 cs <- zipWithM (constrain env) (map snd fields) (map VarN vars)
126132 let fields' = SrcT.fieldMap (zip (map fst fields) (map VarN vars))
127133 recordType = record fields' (TermN EmptyRecord1)
128− return . ex vars $ CAnd (tipe === recordType : cs)
134+ return . ex vars . and $ tipe === recordType : cs
129135
130136 Markdown _ ->
131137 return $ tipe === Env.get env Env.types "Element"
132138
133139 Let defs body ->
134140 do c <- case body of
135− L _ (Var name) | name == saveEnvName -> return CSaveEnv
141+ L _ (Var name) | name == saveEnvName -> return (L span CSaveEnv)
136142 _ -> constrain env body tipe
137143 (schemes, rqs, fqs, header, c2, c1) <-
138144 Monad.foldM (constrainDef env)
139− ([], [], [], Map.empty, CTrue, CTrue)
145+ ([], [], [], Map.empty, true, true)
140146 (collapseDefs defs)
141− return $ CLet schemes
142− (CLet [Scheme rqs fqs (CLet [monoscheme header] c2) header ]
147+ return $ clet schemes
148+ (clet [Scheme rqs fqs (clet [monoscheme header] c2) header ]
143149 (c1 /\ c))
144150
145151constrainDef env info (pattern, expr, maybeTipe) =
@@ -154,7 +160,7 @@ constrainDef env info (pattern, expr, maybeTipe) =
154160 (vars, typ) <- Env.instantiateType env tipe Map.empty
155161 let scheme = Scheme { rigidQuantifiers = [],
156162 flexibleQuantifiers = flexiVars ++ vars,
157− constraint = CTrue,
163+ constraint = Loc.none CTrue,
158164 header = Map.singleton name typ }
159165 c <- constrain env' expr typ
160166 return ( scheme : schemes