module shallow import StdEnv import Data.Func import Data.Functor import Data.Either import Data.List import Data.Maybe import Control.Applicative import Control.Monad :: Expr :== ([(String, Int)] -> Either String Int //Evaluator , String) //Printer lit :: Int -> Expr lit i = (const $ pure i, toString i) var :: String -> Expr var s = ( maybe (Left $ "Undefined variable " +++ s) Right o lookup s , s ) (+.) infixl 6 :: Expr Expr -> Expr (+.) (ea, pa) (eb, pb) = ( \s->liftM2 (+) (ea s) (eb s) , pa +++ " + " +++ pb ) print :: Expr -> String print (_, p) = p eval :: Expr [(String, Int)]-> Either String Int eval (e, _) s = e s Start = eval (lit 5 +. lit 37) []