9 import Control.Applicative
15 | (+.) infixl 6 Expr Expr
17 eval :: Expr -> ([(String, Int)] -> Either String Int)
18 eval (Lit i) = const $ pure i
19 eval (Var s) = maybe (Left $ "Undefined variable " +++ s) Right o lookup s
20 eval (a +. b) = \s->liftM2 (+) (eval a s) (eval b s)
22 print :: Expr -> String
23 print (Lit i) = toString i
25 print (a +. b) = print a +++ " + " +++ print b
27 Start = eval (Lit 5 +. Lit 37) []