Bei der Übersetzung werden „frische`` Variablennamen benötigt (= die im Eingangsprogramm nicht vorkommen).
import Control.Monad.State data State s a = State ( s -> ( a, s ) ) get :: State s s ; put :: s -> State () evalState :: State s a -> s -> a fresh :: State Int String fresh = do k <- get ; put (k+1) return $ "f." ++ show k type Transform a = State Int a cps :: Exp -> Transform Exp