module IL.Typing (Typeable(..)) where
import Base.Messages (internalError)
import IL.Type
class Typeable a where
typeOf :: a -> Type
instance Typeable ConstrTerm where
typeOf (LiteralPattern ty _) = ty
typeOf (ConstructorPattern ty _ _) = ty
typeOf (VariablePattern ty _) = ty
instance Typeable Expression where
typeOf (Literal ty _) = ty
typeOf (Variable ty _) = ty
typeOf (Function ty _ _) = ty
typeOf (Constructor ty _ _) = ty
typeOf (Apply e _) = case typeOf e of
TypeArrow _ ty -> ty
_ -> internalError "IL.Typing.typeOf: application"
typeOf (Case _ _ as) = typeOf $ head as
typeOf (Or e _) = typeOf e
typeOf (Exist _ _ e) = typeOf e
typeOf (Let _ e) = typeOf e
typeOf (Letrec _ e) = typeOf e
typeOf (Typed e _) = typeOf e
instance Typeable Alt where
typeOf (Alt _ e) = typeOf e