@@ -6,9 +6,10 @@ import qualified Data.Set as Set
6import Control.Arrow (second)
6import Control.Arrow (second)
7import Control.Applicative ((<$>),(<*>))
7import Control.Applicative ((<$>),(<*>))
8import qualified Control.Monad as Monad
8import qualified Control.Monad as Monad
9−import Control.Monad.Error (ErrorT, runErrorT)
9+import Control.Monad.Error
10import Control.Monad.State
10import Control.Monad.State
11import Data.Traversable (traverse)
11import Data.Traversable (traverse)
12+import qualified Text.PrettyPrint as PP
13import SourceSyntax.Location as Loc
14import SourceSyntax.Location as Loc
14import SourceSyntax.Pattern (Pattern(PVar))
15import SourceSyntax.Pattern (Pattern(PVar))
@@ -22,7 +23,7 @@ import qualified Type.Constrain.Pattern as Pattern
22import qualified Transform.SortDefinitions as SD
23import qualified Transform.SortDefinitions as SD
25−constrain :: Env.Environment -> LExpr a b -> Type -> IO TypeConstraint
26+constrain :: Env.Environment -> LExpr a b -> Type -> ErrorT [PP.Doc] IO TypeConstraint
26constrain env (L span expr) tipe =
27constrain env (L span expr) tipe =
27 let list t = Env.get env Env.types "_List" <| t
28 let list t = Env.get env Env.types "_List" <| t
28 and = L span . CAnd
29 and = L span . CAnd
@@ -32,7 +33,7 @@ constrain env (L span expr) tipe =
32 clet schemes c = L span (CLet schemes c)
33 clet schemes c = L span (CLet schemes c)
34 case expr of
35 case expr of
35− Literal lit -> Literal.constrain env span lit tipe
36+ Literal lit -> liftIO $ Literal.constrain env span lit tipe
37 Var name | name == saveEnvName -> return (L span CSaveEnv)
38 Var name | name == saveEnvName -> return (L span CSaveEnv)
38 | otherwise -> return (name <? tipe)
39 | otherwise -> return (name <? tipe)
@@ -87,7 +88,7 @@ constrain env (L span expr) tipe =
87 and . (:) ce <$> mapM branch branches
88 and . (:) ce <$> mapM branch branches
89 Data name exprs ->
90 Data name exprs ->
90− do vars <- forM exprs $ \_ -> var Flexible
91+ do vars <- forM exprs $ \_ -> liftIO (var Flexible)
91 let pairs = zip exprs (map VarN vars)
92 let pairs = zip exprs (map VarN vars)
92 (ctipe, cs) <- Monad.foldM step (tipe,true) (reverse pairs)
93 (ctipe, cs) <- Monad.foldM step (tipe,true) (reverse pairs)
93 return $ ex vars (cs /\ name <? ctipe)
94 return $ ex vars (cs /\ name <? ctipe)
@@ -114,11 +115,11 @@ constrain env (L span expr) tipe =
115 Modify e fields ->
116 Modify e fields ->
116 exists $ \t -> do
117 exists $ \t -> do
117− oldVars <- forM fields $ \_ -> var Flexible
118+ oldVars <- forM fields $ \_ -> liftIO (var Flexible)
118 let oldFields = SrcT.fieldMap (zip (map fst fields) (map VarN oldVars))
119 let oldFields = SrcT.fieldMap (zip (map fst fields) (map VarN oldVars))
119 cOld <- ex oldVars <$> constrain env e (record oldFields t)
120 cOld <- ex oldVars <$> constrain env e (record oldFields t)
121− newVars <- forM fields $ \_ -> var Flexible
122+ newVars <- forM fields $ \_ -> liftIO (var Flexible)
122 let newFields = SrcT.fieldMap (zip (map fst fields) (map VarN newVars))
123 let newFields = SrcT.fieldMap (zip (map fst fields) (map VarN newVars))
123 let cNew = tipe === record newFields t
124 let cNew = tipe === record newFields t
@@ -127,7 +128,7 @@ constrain env (L span expr) tipe =
127 return $ cOld /\ ex newVars (and (cNew : cs))
128 return $ cOld /\ ex newVars (and (cNew : cs))
129 Record fields ->
130 Record fields ->
130− do vars <- forM fields $ \_ -> var Flexible
131+ do vars <- forM fields $ \_ -> liftIO (var Flexible)
131 cs <- zipWithM (constrain env) (map snd fields) (map VarN vars)
132 cs <- zipWithM (constrain env) (map snd fields) (map VarN vars)
132 let fields' = SrcT.fieldMap (zip (map fst fields) (map VarN vars))
133 let fields' = SrcT.fieldMap (zip (map fst fields) (map VarN vars))
133 recordType = record fields' (TermN EmptyRecord1)
134 recordType = record fields' (TermN EmptyRecord1)
@@ -146,15 +147,16 @@ constrain env (L span expr) tipe =
146 (clet [Scheme rqs fqs (clet [monoscheme header] c2) header ]
147 (clet [Scheme rqs fqs (clet [monoscheme header] c2) header ]
147 (c1 /\ c))
148 (c1 /\ c))
149constrainDef env info (pattern, expr, maybeTipe) =
151constrainDef env info (pattern, expr, maybeTipe) =
150 let qs = [] -- should come from the def, but I'm not sure what would live there...
152 let qs = [] -- should come from the def, but I'm not sure what would live there...
151 (schemes, rigidQuantifiers, flexibleQuantifiers, headers, c2, c1) = info
153 (schemes, rigidQuantifiers, flexibleQuantifiers, headers, c2, c1) = info
153− do rigidVars <- mapM (\_ -> var Rigid) qs -- Some mistake may be happening here.
155+ do rigidVars <- forM qs (\_ -> liftIO $ var Rigid) -- Some mistake may be happening here.
154− -- Currently, qs is always the empty list.
156+ -- Currently, qs is always [].
155 case (pattern, maybeTipe) of
157 case (pattern, maybeTipe) of
156 (PVar name, Just tipe) -> do
158 (PVar name, Just tipe) -> do
157− flexiVars <- mapM (\_ -> var Flexible) qs
159+ flexiVars <- forM qs (\_ -> liftIO $ var Flexible)
158 let inserts = zipWith (\arg typ -> Map.insert arg (VarN typ)) qs flexiVars
160 let inserts = zipWith (\arg typ -> Map.insert arg (VarN typ)) qs flexiVars
159 env' = env { Env.value = List.foldl' (\x f -> f x) (Env.value env) inserts }
161 env' = env { Env.value = List.foldl' (\x f -> f x) (Env.value env) inserts }
160 (vars, typ) <- Env.instantiateType env tipe Map.empty
162 (vars, typ) <- Env.instantiateType env tipe Map.empty
@@ -171,7 +173,7 @@ constrainDef env info (pattern, expr, maybeTipe) =
171 , fl rigidVars c /\ c1 )
173 , fl rigidVars c /\ c1 )
173 (PVar name, Nothing) -> do
175 (PVar name, Nothing) -> do
174− v <- var Flexible
176+ v <- liftIO $ var Flexible
175 let tipe = VarN v
177 let tipe = VarN v
176 inserts = zipWith (\arg typ -> Map.insert arg (VarN typ)) qs rigidVars
178 inserts = zipWith (\arg typ -> Map.insert arg (VarN typ)) qs rigidVars
177 env' = env { Env.value = List.foldl' (\x f -> f x) (Env.value env) inserts }
179 env' = env { Env.value = List.foldl' (\x f -> f x) (Env.value env) inserts }
@@ -183,7 +185,6 @@ constrainDef env info (pattern, expr, maybeTipe) =
183 , c /\ c2
185 , c /\ c2
187expandPattern :: (Pattern, LExpr t v, Maybe SrcT.Type)
188expandPattern :: (Pattern, LExpr t v, Maybe SrcT.Type)
188 -> [(Pattern, LExpr t v, Maybe SrcT.Type)]
189 -> [(Pattern, LExpr t v, Maybe SrcT.Type)]
189expandPattern triple@(pattern, lexpr@(L s _), maybeType) =
190expandPattern triple@(pattern, lexpr@(L s _), maybeType) =
@@ -212,9 +213,9 @@ collapseDefs = concatMap expandPattern . go [] Map.empty Map.empty
212 TypeAnnotation name typ ->
213 TypeAnnotation name typ ->
213 go output defs (Map.insert name typ typs) ds
214 go output defs (Map.insert name typ typs) ds
215−try :: SrcSpan -> ErrorT String IO a -> IO a
216+try :: SrcSpan -> ErrorT (SrcSpan -> PP.Doc) IO a -> ErrorT [PP.Doc] IO a
216try span computation = do
217try span computation = do
217− result <- runErrorT computation
218+ result <- liftIO $ runErrorT computation
218 case result of
219 case result of
219− Left msg -> error $ "\nType error " ++ show span ++ "\n" ++ msg
220+ Left err -> throwError [err span]
220− Right value -> return value
221+ Right value -> return value