IO-Monade ist die Monade der funktionalen Programmierung, die Ein- und Ausgabe sowie alle Seiteneffekte typsicher kapselt. Haskell ist eine rein funktionale Sprache: reine Funktionen liefern für gleiche Eingaben gleiche Ausgaben und berühren keine Außenwelt. Trotzdem müssen Programme Dateien lesen, auf Tastatur warten oder Zufall erzeugen. Genau dafür existiert die IO-Monade.

Eine Aktion als Wert

Eine IO-Aktion vom Typ IO a ist ein Wert, der bei seiner Ausführung ein Ergebnis vom Typ a liefert und dabei Seiteneffekte haben darf. Das Hauptprogramm ist selbst eine solche Aktion:

main :: IO ()
main = do
  putStrLn "Wie heißt du?"
  name <- getLine
  putStrLn ("Hallo, " ++ name ++ "!")

Die do-Notation verknüpft Aktionen in fester Reihenfolge; das Symbol <- bindet das Ergebnis einer Aktion an eine Variable. So schreibt man sequenzielle Abläufe im Stil imperativer Sprachen, bleibt aber rein funktional, weil die Reihenfolge explizit durch die Monaden-Verkettung festgelegt ist und nicht von der Lazy-Evaluation umsortiert werden kann.

Warum das stark ist

  • Der Typ verrät, welche Funktionen mit der Außenwelt sprechen: IO in der Signatur ist sichtbar, nicht versteckt.
  • Reiner Code bleibt referenziell transparent, testbar und parallelisierbar; IO lebt am Rand des Programms (Functional Core, Imperative Shell).
  • Ein bekanntes Schlupfloch ist unsafePerformIO :: IO a -> a — es bricht die Reinheit und sollte nur für Konstanten oder Interop verwendet werden.

Verwandte Grundlagen: Monade, Seiteneffekte, Reine Funktionen, Haskell-Befehle.