{---- Monadic parser for a simple lambda calculus. ----} module Lambda where import Control.Monad.State import MonParser import Lexing -- -- lambda calculus parser -- data Expr = App Expr Expr | Lam String Expr | Let String Expr Expr | Var String deriving Show expr = atom `chainl1` (return App) atom = lam +++ local +++ paren +++ var --atom = lam +++ local +++ var +++ paren lam = do symbol "\\" x <- variable symbol "->" e <- expr return $ Lam x e local = do symbol "let" x <- variable symbol "=" e <- expr symbol "in" e' <- expr return $ Let x e e' var = do x <- variable return $ Var x paren = bracket (symbol "(") expr (symbol ")") variable = identifier ["let", "in"]