-
[clean-tests.git] / old / expr / deep.icl
1 module deep
2
3 import StdEnv
4 import Data.Func
5 import Data.Functor
6 import Data.Either
7 import Data.List
8 import Data.Maybe
9 import Control.Applicative
10 import Control.Monad
11
12 :: Expr
13 = Lit Int
14 | Var String
15 | (+.) infixl 6 Expr Expr
16
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)
21
22 print :: Expr -> String
23 print (Lit i) = toString i
24 print (Var s) = s
25 print (a +. b) = print a +++ " + " +++ print b
26
27 Start = eval (Lit 5 +. Lit 37) []