--- /dev/null
+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) []