implementation module exist import StdEnv import Data.Func import Data.Functor import Data.Either import Data.List import Data.Maybe import Control.Applicative import Control.Monad class eval m :: m -> ([(String, Int)] -> Either String Int) class print m :: m -> String instance eval Expr where 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) eval (Ext e) = eval e instance print Expr where print (Lit i) = toString i print (Var s) = s print (a +. b) = print a +++ " + " +++ print b print (Ext e) = print e Start = eval (Lit 5 +. Lit 37) []