-- | Typing Module module SSTG.Core.Syntax.Typer ( module SSTG.Core.Syntax.Typer ) where import SSTG.Core.Syntax.Language varType :: Var -> Type varType (Var _ ty) = ty litType :: Lit -> Type litType (MachChar _ ty) = ty litType (MachStr _ ty) = ty litType (MachInt _ ty) = ty litType (MachWord _ ty) = ty litType (MachFloat _ ty) = ty litType (MachDouble _ ty) = ty litType (MachNullAddr ty) = ty litType (BlankAddr) = Bottom litType (SymLit var) = varType var litType (SymLitEval pf args) = TyClosure (primFunType pf) (map atomType args) atomType :: Atom -> Type atomType (VarAtom var) = varType var atomType (LitAtom lit) = litType lit primFunType :: PrimFun -> Type primFunType (PrimFun _ ty) = ty dataConType :: DataCon -> Type dataConType (DataCon _ ty _) = ty altType :: Alt -> Type altType (Alt _ _ expr) = exprType expr exprType :: Expr -> Type exprType (Atom atom) = atomType atom exprType (PrimApp pf args) = TyClosure (primFunType pf) (map atomType args) exprType (ConApp dcon _) = dataConType dcon exprType (FunApp fun args) = TyClosure (varType fun) (map atomType args) exprType (Let _ expr) = exprType expr exprType (Case _ _ (a:_)) = altType a