data Object = .. | OFunction { args :: [ Name ] , body :: Expression , env :: Env Object } eval env exp = case exp of ... Lambda { args = a, body = b } -> return $ OFunction { args = a,body = b,env = env } Apply f xs -> do ff <- eval env f vs <- mapM ( eval env ) xs let env' = Env.new ( Object.env ff ) $ zip ( Object.args ff ) vs eval env' ( Object.body ff )