import Data.Map (Map)
import qualified Data.Map as Map
+-- type erasure
+eraseType (AST decls) =
+ AST $ map (\(Decl f ftype ps e) ->
+ Decl f FTUndet (map eraseTypeP ps) (eraseTypeE e)) decls
+
+eraseTypeP (PVar id t varname)
+ = PVar id TUndet varname
+eraseTypeP (PCon id t conname ps)
+ = PCon id TUndet conname (map eraseTypeP ps)
+
+eraseTypeE (EVar id t varname)
+ = EVar id TUndet varname
+eraseTypeE (ECon id t conname es)
+ = ECon id TUndet conname (map eraseTypeE es)
+eraseTypeE (EFun id t funname es)
+ = EFun id TUndet funname (map eraseTypeE es)
+
+eraseTypeT (TAST decls) =
+ TAST $ map (\(TDecl f ps es bs) ->
+ TDecl f (map eraseTypeP ps) (map eraseTypeE es)bs) decls
-- type inference
do { es' <- mapM assignTypeVarsE es
; unifyFT t' (TFun [] (map typeofE es') (TVar i))
; unifyT t (TVar i)
- ; return $ ECon id (TVar i) c es' }}
+ ; return $ ECon id (TVar i) c es' }
+ Nothing -> fail $ "No type " ++ show c ++ " in type map"
+ }
assignTypeVarsE (EFun id t f es) =
do { i <- newTypeVar
; case lookup f (typeMap ++ tmpMap) of
TCon t (map (replaceTVar table) ts)
-
\ No newline at end of file
+