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? "