1
1
mirror of https://github.com/sdiehl/wiwinwlh.git synced 2024-09-20 00:09:33 +03:00
wiwinwlh/transformer.hs
2014-03-31 19:17:19 -05:00

30 lines
527 B
Haskell

import Control.Monad.Reader
data Expr
= Val Int
| Add Expr Expr
| Var String
deriving (Show)
type Env = [(String, Int)]
type Eval a = ReaderT Env Maybe a
eval :: Expr -> Eval Int
eval (Val n) = return n
eval (Add x y) = liftM2 (+) (eval x) (eval y)
eval (Var x) = do
env <- ask
val <- lift (lookup x env)
return val
ex :: Eval Int
ex = eval (Add (Val 2) (Add (Val 1) (Var "x")))
env :: Env
env = [("x", 2), ("y", 5)]
example1, example2 :: Maybe Int
example1 = runReaderT ex env
example2 = runReaderT ex []