elm/compiler/Type/Environment.hs
Evan Czaplicki 0ed72056b6 Add pretty printing for type constraints.
Convert source-syntax types into type-checker types and print them
with pretty type variables.

Generate constraints for let-expressions using type annotations.

Build test function to turn strings into type constraints.
2013-07-08 16:47:44 +02:00

41 lines
No EOL
1.2 KiB
Haskell

module Type.Environment where
import qualified Data.Map as Map
import Data.Map ((!))
import qualified Data.UnionFind.IO as UF
import Type.Type
data Environment = Environment {
constructor :: Map.Map String ([Variable], Type),
builtin :: Map.Map String Type,
value :: Map.Map String Type
}
initialEnvironment :: IO Environment
initialEnvironment = do
let mkPair name = fmap ((,) name . VarN) (namedVar name)
list <- mkPair "[_]"
int <- mkPair "Int"
prims <- mapM mkPair ["Float","Char","Bool","Element"]
let builtins = list : int : prims
cons <- do v <- flexibleVar
let vlist = TermN (App1 (snd list) (VarN v))
return ([v], VarN v ==> vlist ==> vlist)
nil <- do v <- flexibleVar
return ([v], TermN (App1 (snd list) (VarN v)))
let add = snd int ==> snd int ==> snd int
return $ Environment {
constructor = Map.fromList [("::", cons), ("[]", nil)],
builtin = Map.fromList builtins,
value = Map.empty -- Map.fromList [("+", add)]
}
get :: Environment -> (Environment -> Map.Map String a) -> String -> a
get env subDict key = Map.findWithDefault err key (subDict env)
where
err = error $ "Could not find '" ++ key ++ "' in the type environment."