ushalow
[clean-tests.git] / expr / exist / exist.icl
1 implementation module exist
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 class eval m :: m -> ([(String, Int)] -> Either String Int)
13 class print m :: m -> String
14
15 instance eval Expr
16 where
17 eval (Lit i) = const $ pure i
18 eval (Var s) = maybe (Left $ "Undefined variable " +++ s) Right o lookup s
19 eval (a +. b) = \s->liftM2 (+) (eval a s) (eval b s)
20 eval (Ext e) = eval e
21
22 instance print Expr
23 where
24 print (Lit i) = toString i
25 print (Var s) = s
26 print (a +. b) = print a +++ " + " +++ print b
27 print (Ext e) = print e
28
29 Start = eval (Lit 5 +. Lit 37) []