Ist es möglich, Either
ähnlich wie Option
zu behandeln? In Option
habe ich eine Funktion getOrElse
, in Either
Ich möchte Left
oder process Right
zurückgeben. Ich bin auf der Suche nach dem schnellsten Weg, dies zu tun, ohne irgendein Beispiel wie:
In Scala 2.12,
so können Sie
tun %Vor% wenn Sie es lesbarer als fold
finden.
Sowohl Cchanteps als auch Marths sind gute Lösungen für Ihr unmittelbares Problem. Aber im weiteren Sinne ist es schwierig, sie als etwas völlig Analoges zu Option
zu behandeln, insbesondere, wenn Sie Sequenzen von potenziell failable Berechnungen für Comprehensions ausdrücken können. Entweder hat eine Projektions-API (in der chanstep-Lösung verwendet), aber es ist ein bisschen kaputt. (Jede der Projektionen bricht mit Wachen, Mustererkennung oder Variablenzuweisung ein.)
FWIW, ich habe eine Bibliothek geschrieben, um dieses Problem zu lösen. Es erweitert Entweder mit diese API . Sie definieren eine "Voreingenommenheit" für Ihre Eithers. "Right bias" bedeutet, dass der normale Fluss (map, get, etc.) durch ein Right
Objekt repräsentiert wird, während Left
Objekte eine Art von Problem darstellen. (Right Bias ist konventionell, obwohl Sie auch eine linke Bias definieren können, wenn Sie bevorzugen.) Dann können Sie die Either
wie eine Option
behandeln; Es bietet eine völlig analoge API.
Nützlicher ist, dass Sie jetzt entweder wie eine echte scala monad behandeln können, also flatMap, map, filter und comprehensions verwenden:
%Vor%oder
%Vor% Wenn alle Verarbeitungsschritte erfolgreich waren, ist locPopPair
ein Right[Long]
. Wenn etwas schief gegangen ist, wird es das erste Left[String]
sein.
Es ist etwas komplexer, aber eine gute Idee, ein leeres Token zu definieren. Sehen wir uns eine kleine Variation des obigen Verständnisses an:
%Vor% Was würde passieren, wenn der Test p.x > 1000
fehlgeschlagen wäre? Wir möchten etwas Left
zurückgeben, das "leer" bedeutet, aber es gibt keinen universellen passenden Wert (nicht alle Left
sind Left[String]
. Was jetzt passieren würde ist, dass der Code einen% werfen würde co_de% Aber wir können selbst ein leeres Token angeben:
Wenn der NoSuchElementException
-Test fehlschlägt, gibt es keine Ausnahme, p.x > 1000
ist nur locPopPair
.
Sie können .fold
:
Bearbeiten:
Wenn Sie Ihre Frage erneut lesen, ist mir unklar, ob Sie den Wert in Left
oder einen anderen Wert (anderswo definiert) zurückgeben möchten
Wenn es ersteres ist, können Sie identity
an .fold
übergeben, dies kann jedoch den Rückgabetyp in Any
ändern: