packages feed

parconc-examples-0.3: parinfer/parinfer.hs

--
-- 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)