{-# LANGUAGE GADTs #-}

module Problem4 where

-- a)

data Expr t where
  Lit  :: Int -> Expr Int
  Plus :: Expr (Int -> Int -> Int)
  App  :: Expr (a -> b) -> Expr a -> Expr b

-- b)

eval :: Expr t -> t
eval (Lit n)     = n
eval Plus        = (+)
eval (App e1 e2) = (eval e1) (eval e2)