module HM.Term
( -- * Types
- VarName
+ Literal(..)
+ , VarName
, TypeVarName
, TypeName
, Term(..)
, TypedTerm(..)
, Type(..)
, TypeScheme(..)
+ , PrimOp(..)
) where
type VarName = String
data Type = Primitive TypeName | TypeVar TypeVarName | TypeFunction Type Type deriving (Eq)
data TypeScheme = TScheme Type | TSForAll TypeVarName TypeScheme deriving (Eq)
-data Term = Var VarName | Lam VarName TypedTerm | App TypedTerm TypedTerm | Let VarName TypedTerm TypedTerm
+data Term = Var VarName | Lam VarName TypedTerm | App TypedTerm TypedTerm | Let VarName TypedTerm TypedTerm | Lit Literal
data TypedTerm = NTTerm Term | TTerm Term TypeScheme
+data Literal = LInt Integer | LBool Bool | LFunc PrimOp deriving (Eq)
+
+data PrimOp = If deriving (Eq, Show)