liquidhaskell-0.4.0.0: tests/neg/Eval.hs
module Eval (eval) where
import Language.Haskell.Liquid.Prelude (liquidError)
import Prelude hiding (lookup)
type Val = Int
type Bndr = Int
data Expr = Const Int
| Var Bndr
| Plus Expr Expr
| Let Bndr Expr Expr
type Env = [(Bndr, Val)]
----------------------------------------------------------------
lookup :: Bndr -> Env -> Val
--------------------- -------------------------------------------
lookup x ((y,v):env)
| x == y = v
| otherwise = lookup x env
lookup x [] = liquidError "Unbound Variable"
----------------------------------------------------------------
eval :: Env -> Expr -> Val
----------------------------------------------------------------
eval env (Const i) = i
eval env (Var x) = lookup x env
eval env (Plus e1 e2) = eval env e1 + eval env e2
eval env (Let x e1 e2) = eval env' e2
where
env' = (x, eval env e1) : env