-- -- Adapted from the program "infer", believed to have been originally -- authored by Philip Wadler, and used in the nofib benchmark suite -- since at least the late 90s. -- module Main where import Parse import Lex import Term import Type import Environment import InferMonad import Infer import Control.Monad.Par.Scheds.Trace import System.IO import System.Exit import qualified Data.Map as Map main :: IO () main = do l <- getContents case parseBinds (alexScanTokens l) of Left err -> die err Right t -> print (inferBinds initialEnv t) die :: String -> IO () die s = hPutStrLn stderr s >> exitWith (ExitFailure 1) test :: String -> IO () test str = case parseExp (alexScanTokens str) of Left err -> die err Right t -> print (useI (error "type error") $ inferTerm initialEnv t) inferBinds :: Env -> [(VarId,Term)] -> [(VarId,PolyType)] inferBinds e t = runPar $ do ys <- mapM (\(x,ty) -> do v <- newFull ty; return (x,v)) (unmakeEnv e) let topenv = Map.fromList ys inferTop topenv t initialEnv :: Env initialEnv = foldl (uncurry . extendGlobal) emptyEnv types where types = [("+",intop),("*",intop),("-",intop),("/",intop)] intop = All [] (intType `arrow` intType `arrow` intType)