on master help sign in
Create the Type.Inference module which handles type inference from
67ef1ecEvan Czaplicki
compiler/Type/Constrain/Declaration.hs−28
@@ -16,34 +16,6 @@ import qualified SourceSyntax.Pattern as SP
16import qualified SourceSyntax.Expression as SE
16import qualified SourceSyntax.Expression as SE
17import qualified SourceSyntax.Type as ST
17import qualified SourceSyntax.Type as ST
18
18
19−{-- testing section --}
20−import SourceSyntax.PrettyPrint
21−import SourceSyntax.Module
22−import Text.PrettyPrint as P
23−import Parse.Parser (parseProgram)
24−import Type.Solve (solve)
25−import qualified Type.State as TS
26−import Control.Monad.State
27−import Transform.SortDefinitions as Sort
28−
29−test filePath = do
30− src <- readFile filePath
31− case parseProgram src of
32− Left err -> error $ "Parse error at " ++ show err
33− Right (Module _ _ _ decls) -> do
34− env <- Env.initialEnvironment
35− var <- T.flexibleVar
36− let expr = sortDefs (toExpr decls)
37− print $ pretty expr
38− constraint <- TcExpr.constrain env expr (T.VarN var)
39− --print =<< T.extraPretty constraint
40− (env,_,_,errors) <- execStateT (solve constraint) TS.initialState
41− forM (Map.toList env) $ \(n,t) -> do
42− pt <- T.extraPretty t
43− print $ P.text n <+> P.text ":" <+> pt
44− if null errors then return () else do
45− putStrLn "\n"
46− mapM_ print =<< sequence errors
47
19
48toExpr decls =
20toExpr decls =
49 SL.none $ SE.Let (concatMap toDefs decls) (SL.none $ SE.Literal (SL.IntNum 42))
21 SL.none $ SE.Let (concatMap toDefs decls) (SL.none $ SE.Literal (SL.IntNum 42))
compiler/Type/Inference.hsnew file+28
@@ -0,0 +1,28 @@
1+module Type.Inference where
2+
3+import qualified Data.Map as Map
4+
5+import qualified Type.Type as T
6+import qualified Type.Environment as Env
7+import qualified Type.Constrain.Expression as TcExpr
8+import qualified Type.Constrain.Declaration as TcDecl
9+import qualified Type.Solve as Solve
10+
11+import SourceSyntax.Module
12+import Text.PrettyPrint
13+import qualified Type.State as TS
14+import Control.Monad.State
15+import Transform.SortDefinitions as Sort
16+
17+
18+infer :: Module t v -> IO (Either [Doc] (Map.Map String T.Variable))
19+infer (Module _ _ _ decls) = do
20+ env <- Env.initialEnvironment
21+ var <- T.flexibleVar
22+ let expr = sortDefs (TcDecl.toExpr decls)
23+ constraint <- TcExpr.constrain env expr (T.VarN var)
24+ (env,_,_,errors) <- execStateT (Solve.solve constraint) TS.initialState
25+ if null errors
26+ then return $ Right env
27+ else Left `fmap` sequence errors
28+
compiler/Type/Solve.hs+1−1
@@ -1,5 +1,5 @@
1{-# OPTIONS_GHC -XMultiWayIf #-}
1{-# OPTIONS_GHC -XMultiWayIf #-}
2−module Type.Solve where
2+module Type.Solve (solve) where
3
3
4import Control.Monad
4import Control.Monad
5import Control.Monad.State
5import Control.Monad.State