module deep import StdEnv import Data.Func import Data.Functor import Data.Either import Data.List import Data.Maybe import Control.Applicative import Control.Monad :: Expr = Lit Int | Var String | (+.) infixl 6 Expr Expr eval :: Expr -> ([(String, Int)] -> Either String Int) eval (Lit i) = const $ pure i eval (Var s) = maybe (Left $ "Undefined variable " +++ s) Right o lookup s eval (a +. b) = \s->liftM2 (+) (eval a s) (eval b s) print :: Expr -> String print (Lit i) = toString i print (Var s) = s print (a +. b) = print a +++ " + " +++ print b Start = eval (Lit 5 +. Lit 37) []