1 module Main where
    2 
    3 import Parse
    4 import Shows
    5 import Term
    6 import Type
    7 import Environment
    8 import InferMonad
    9 import Substitution     ( Sub )
   10 import MaybeM     ( Maybe )
   11 import Infer
   12 
   13 main          =  interact
   14                    ( showsString (show testEnv ++ prompt)
   15                    . concat
   16                    . map readInferShow
   17                    . lines
   18                    )
   19 
   20 readInferShow :: String -> String
   21 readInferShow =  useP ("Failed to parse" ++ prompt)   (
   22                  lexactlyP reads                      `eachP` (\t ->
   23                  useI ("Failed to type" ++ prompt)    (
   24                  inferTerm testEnv t                  `eachI` (\tt ->
   25                  show t ++ " : " ++ show tt ++ prompt))))
   26 testEnv       :: Env
   27 testEnv       =  read
   28                    (   "[ unit   : x -> List x,"
   29                    ++  "  append : List x -> List x -> List x,"
   30                    ++  "  fix    : (x -> x) -> x ]"
   31                    )
   32 prompt        :: String
   33 prompt        =  "\n? "