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> mit Ok und Err, verketten mit ? beziehungsweise and_then — die Fehlerbehandlung erfolgt ausdrücklich und typsicher.
  • Kotlin: Result<T> mit Success und Failure.
  • Scala: Either beziehungsweise Try.
  • TypeScript: Result-Typen in Bibliotheken wie fp-ts, mit fold und chain.

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.