module AST where data Program t = Program [FunDef t] deriving (Show) data FunDef t = FunDef Name (Maybe Type) [FunEq t] deriving (Show) newtype Name = Name String deriving (Show) data Type = TApp Name [Type] | TTup [Type] | TList Type | TFun Type Type deriving (Show) data FunEq t = FunEq Name [Pattern t] (RHS t) deriving (Show) data Pattern t = PWildcard t | PVar t Name | PAs t Name (Pattern t) | PCon t Name [Pattern t] | PList t [Pattern t] | PTup t [Pattern t] deriving (Show) data RHS t = Guarded [(Expr t, Expr t)] | Plain (Expr t) deriving (Show) data Expr t = ELit t Literal | EList t [Expr t] | ETup t [Expr t] | EApp t (Expr t) (Expr t) | EOp t (Expr t) Operator (Expr t) | EIf t (Expr t) (Expr t) (Expr t) | ECase t (Expr t) [(Pattern t, RHS t)] | ELet t [FunDef t] (Expr t) deriving (Show) data Literal = LInt Int | LFloat Double | LChar Char | LString String deriving (Show) data Operator = OAdd | OSub | OMul | ODiv | OMod deriving (Show)