-- | Typing Module module SSTG.Core.Language.Typing ( module SSTG.Core.Language.Typing ) where import SSTG.Core.Language.Syntax -- | Variable type. varType :: Var -> Type varType (Var _ ty) = ty -- | Literal type. 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 (MachLabel _ _ ty) = ty litType (MachNullAddr ty) = ty litType (BlankAddr) = Bottom litType (AddrLit _) = Bottom litType (SymLit var) = varType var litType (SymLitEval pf args) = foldl AppTy (primfunType pf) (map litType args) -- | Atom type. atomType :: Atom -> Type atomType (LitAtom lit) = litType lit atomType (VarAtom var) = varType var -- | Primitive function type. primfunType :: PrimFun -> Type primfunType (PrimFun _ ty) = ty -- | Data constructor type denoted as a function. dataconType :: DataCon -> Type dataconType (DataCon _ ty tys) = foldr FunTy ty tys -- | Alt type altType :: Alt -> Type altType (Alt _ _ expr) = exprType expr -- | I wonder what this could possibly be? exprType :: Expr -> Type exprType (Atom atom) = atomType atom exprType (PrimApp pf args) = foldl AppTy (primfunType pf) (map atomType args) exprType (ConApp dc args) = foldl AppTy (dataconType dc) (map atomType args) exprType (FunApp fun args) = foldl AppTy (varType fun) (map atomType args) exprType (Let _ expr) = exprType expr exprType (Case _ _ (a:_)) = altType a exprType _ = Bottom