Bei der Übersetzung werden „frische`` Variablennamen benötigt (= die im Eingangsprogramm nicht vorkommen).
import Data.Set var :: Exp -> Set String
Frische Namen aufzählen und in Zustandsmonade bereitstellen. Zustand ist (unendliche) Liste der frischen Namen.
import Control.Monad.State data State s a = State ( s -> ( a, s ) ) get :: State s s ; put :: s -> State () fresh :: State [String] String fresh = do (n:ns)<-get ; put ns; return n