update arith1.ml
[lambda.git] / code / reader1.hs
1 import Control.Monad.Reader
2 type Bound = Int
3 type Env = Char -> Bound
4
5
6 env0 = \var -> error "Not found"
7 insert var value e = \sought -> if sought == var then value else e sought
8
9 getint :: Char -> Reader Env Int
10 getint var = asks (\e -> let x = e var in x)
11
12 -- monadic versions of `x` and `y`
13 getx = getint 'x'
14 gety = getint 'y'
15
16 -- monadic version of `y + x`
17 expr1 :: Reader Env Int
18 expr1 = liftM2 (+) gety getx
19
20 -- monadic version of `3 + x`
21 expr2 :: Reader Env Int
22 expr2 = liftM2 (+) (return 3) getx
23
24 letx xx body = xx >>= \x -> local (insert 'x' x) body
25
26 -- monadic version of `let x = 2 in 3 + x`
27 expr3 :: Reader Env Int
28 expr3 = letx (return 2) expr2
29
30 res = runReader expr3 env0 -- will be 5
31