Die Maybe-Monade (in vielen Sprachen Option genannt) kapselt den Kontext „ein Wert kann fehlen“. Statt mit Null-Referenzen oder Sonderwerten zu arbeiten, wird das Fehlen explizit im Typ sichtbar und muss vom Programmierer behandelt werden.
Definition
In Haskell ist Maybe eine Summe aus zwei Konstruktoren:
data Maybe a = Nothing | Just a
Ein Wert vom Typ Maybe Int ist also entweder Nothing (kein Wert) oder Just 5 (Wert 5). Der Typ sagt damit schon aus: Hier kann nichts stehen — und die Verarbeitung muss beide Fälle abdecken.
Bind: Der Fehlerfall pflanzt sich fort
Das Herzstück der Monade ist der bind-Operator. Er wendet die nächste Funktion nur auf einen vorhandenen Wert an; bei Nothing wird die Funktion übersprungen und Nothing direkt weitergereicht:
Just x >>= f = f x
Nothing >>= f = Nothing
Damit können beliebig lange Verarbeitungsketten geschrieben werden, ohne jeden Schritt einzeln auf den Fehlerfall zu prüfen — ein einzelnes Nothing bricht die gesamte Kette ab.
Typische Anwendungen
- Sicheres Nachschlagen in einer Map:
Map.lookupliefertMaybestatt einer Exception. - Teilfunktionen total machen: Die erste Element einer leeren Liste, die Division durch null oder das Parsen einer Zeichenkette liefern
Nothingstatt abzustürzen. - Validierung optionaler Eingaben, etwa Formularfelder oder Konfigurationswerte.
Die Idee dahinter ist die totale Funktion: Statt zur Laufzeit zu scheitern, wird das Fehlen als Datenwert modelliert — eine Grundlage für reine Funktionen und Funktionskomposition.
Pendants in anderen Sprachen
Das Konzept ist weit verbreitet:
- Rust:
Option<T>mitSomeundNone, verketten mitand_then. - Java:
Optional<T>mitmapundflatMap. - Kotlin:
null-basierte Sicherheit plus?.-Operator undResultfür Fehler. - F#:
Option<'T>mitSomeundNone. - Swift:
Optionalmitnil, verketten mitflatMap.
In Rust-Befehlen und Kotlin-Befehlen finden sich die typischen Operationen im Praxiseinsatz.
Maybe im Vergleich zu Null
Klassische Null-Referenzen sind unsichtbar: Jeder Aufruf kann scheitern, ohne dass der Typ es verrät. Maybe/Option machen das Fehlen dagegen zur Typinformation. Der Preis ist ausdrückliche Behandlung — Pattern Matching oder flatMap-Ketten statt stiller Dereferenzierung. Das Typsystem erinnert den Entwickler an jeden Fall, in dem ein Wert fehlen kann.
Verwandte Grundlagen: Monade, Either-Monade, Funktionale Programmierung, Typsystem.