State-Monade modelliert zustandsbehaftete Berechnungen in der funktionalen Programmierung, ohne echte Mutation. Ein Zähler, eine Nummerierung oder ein Simulationszustand ist in imperativen Sprachen eine Variable, die verändert wird. Rein funktional gibt es keine Mutation — stattdessen reicht man den Zustand explizit durch: Eine zustandsbehaftete Funktion hat den Typ s -> (a, s): Sie bekommt den alten Zustand s, liefert ein Ergebnis a und den neuen Zustand s.

Die Bausteine

get          :: State s s          -- Zustand lesen
put          :: s -> State s ()    -- Zustand setzen
modify       :: (s -> s) -> State s ()
runState     :: State s a -> s -> (a, s)
evalState    :: State s a -> s -> a     -- nur Ergebnis
execState    :: State s a -> s -> s     -- nur Endzustand

Ein Beispiel vergibt laufende Nummern:

naechsteNummer :: State Int Int
naechsteNummer = do
  n <- get
  put (n + 1)
  pure n

runState naechsteNummer 0   -- (0, 1)

Der Zustand wird also als Parameter durchgereicht und als Rückgabe zurückgegeben; die Monade verbirgt nur das lästige Weiterreichen. Damit bleibt die Berechnung rein: gleicher Eingabezustand, gleiches Ergebnis.

Abgrenzung und Praxis

  • Die Reader-Monade ist der Sonderfall ohne Schreiben (nur lesen), die IO-Monade erlaubt echte Seiteneffekte wie Dateizugriff.
  • Echte Mutation lebt in IO über IORef/STRef; die State-Monade ist die pure Alternative für lokale Zustandsverkettung.
  • Mit dem Monadentransformer StateT s IO kombiniert man Zustand und IO in einem Stack.

Verwandte Grundlagen: Monade, Funktionskomposition, Immutability, Haskell-Befehle.