module Env where -- | Variable names. type Var = String -- | An environment mapping variables to integers. type Env = Var -> Maybe Int -- | An empty environment. empty :: Env empty = \x -> Nothing -- | Set a variable to a value in the environment. set :: Var -> Int -> Env -> Env set x i m = \y -> if x == y then Just i else m y -- | Lookup the value for a variable in the environment. -- -- >>> get "x" (set "x" 3 (set "y" 4 empty)) -- Just 3 -- -- >>> get "y" (set "x" 3 (set "y" 4 empty)) -- Just 4 -- -- >>> get "z" (set "x" 3 (set "y" 4 empty)) -- Nothing -- get :: Var -> Env -> Maybe Int get x m = m x -- | Remove a variable from the environment. -- -- >>> get "y" (unset "y" (set "x" 3 (set "y" 4 empty))) -- Nothing -- -- >>> get "x" (unset "y" (set "x" 3 (set "y" 4 empty))) -- Just 3 -- unset :: Var -> Env -> Env unset x m = \y -> if x == y then empty y else m y