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

30 lines
527 B
Haskell
Raw Normal View History

2014-03-31 10:19:33 +04:00
import Control.Monad.Reader
data Expr
= Val Int
| Add Expr Expr
| Var String
deriving (Show)
type Env = [(String, Int)]
2014-04-01 04:17:19 +04:00
type Eval a = ReaderT Env Maybe a
2014-03-31 10:19:33 +04:00
2014-04-01 04:17:19 +04:00
eval :: Expr -> Eval Int
2014-03-31 10:19:33 +04:00
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
2014-04-01 04:17:19 +04:00
ex :: Eval Int
2014-03-31 10:19:33 +04:00
ex = eval (Add (Val 2) (Add (Val 1) (Var "x")))
2014-04-01 04:17:19 +04:00
env :: Env
env = [("x", 2), ("y", 5)]
example1, example2 :: Maybe Int
example1 = runReaderT ex env
example2 = runReaderT ex []