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 ()
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