Die Either-Monade modelliert Berechnungen mit zwei möglichen Ergebnissen: einem Fehler oder einem Erfolgswert. Anders als die Maybe-Monade trägt der Fehlerfall zusätzliche Informationen — etwa eine Fehlermeldung, einen Statuscode oder eine Validierungsliste.
Definition
In Haskell ist Either eine Summe mit zwei Typparametern:
data Either a b = Left a | Right b
Die Konvention: Left trägt den Fehler, Right den Erfolgswert (englisch right = richtig). Der Typ Either String Int ist also entweder Left "Fehlermeldung" oder Right 42.
Bind: Fehler brechen die Kette ab
Im Monaden-Instanz verhält sich bind wie erwartet: Nur bei Right wird die nächste Funktion angewendet, Left wird unverändert weitergereicht und beendet die Kette:
Right x >>= f = f x
Left e >>= f = Left e
So können mehrere fehlschlagbare Schritte hintereinander ausgeführt werden; beim ersten Fehler endet die Kette und der Fehlerwert ist am Ende verfügbar.
Typische Anwendungen
- Parsing: Eine Zeichenkette in einen Wert umwandeln, mit aussagekräftiger Fehlermeldung im
Left-Zweig. - Validierung: Mehrere Prüfungen verkettet ausführen und den ersten Verstoß melden.
- Datei- und Netzwerkzugriffe: Fehlercodes statt Exceptions als Datenwerte weitertragen.
Pendants in anderen Sprachen
- Rust:
Result<T, E>mitOkundErr, verketten mit?beziehungsweiseand_then— die Fehlerbehandlung erfolgt ausdrücklich und typsicher. - Kotlin:
Result<T>mitSuccessundFailure. - Scala:
EitherbeziehungsweiseTry. - TypeScript:
Result-Typen in Bibliotheken wie fp-ts, mitfoldundchain.
Either im Vergleich zu Exceptions
Exceptions verlassen den normalen Kontrollfluss unsichtbar: Jeder Aufruf kann werfen, der Typ verrät es nicht. Either macht den Fehler dagegen zum Wert — er ist im Typ sichtbar, muss behandelt werden und lässt sich wie jeder andere Wert weiterreichen, kombinieren und testen. Das passt zur Idee der reinen Funktionen: Auch fehlschlagende Berechnungen bleiben vorhersehbar und ohne versteckte Seiteneffekte.
Im Unterschied zur Maybe-Monade geht es nicht um „Wert vorhanden oder nicht“, sondern um „Erfolg oder Fehler mit Detail“. Beide sind konkrete Instanzen des allgemeinen Monaden-Musters.
Verwandte Grundlagen: Funktionale Programmierung, Funktionskomposition, Typsystem, Rust-Befehle, TypeScript-Befehle.