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:
IOin 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.