9 import Control.Applicative
12 :: BM a b = {to :: a->b, fro :: b->a}
16 | Var (BM a Int) String
17 | E.e: Plus (BM a e) (Expr a) (Expr a) & + e
19 eval :: (Expr Int) -> ([(String, Int)] -> Either String Int)
20 eval (Lit _ i) = const $ pure i
21 eval (Var _ s) = maybe (Left $ "Undefined variable " +++ s) Right o lookup s
22 eval (Plus _ a b) = \s->liftM2 (+) (eval a s) (eval b s)
24 print :: (Expr a) -> String
25 print (Lit _ i) = toString i
27 print (Plus _ a b) = print a +++ " + " +++ print b
29 Start = eval (Plus bm (Lit bm 5) (Lit bm 37)) []