Scala Entweder rechts oder links

8

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:

%Vor%     
Michał Jurczuk 31.12.2015, 10:57
quelle

4 Antworten

4

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.

%Vor%

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:

%Vor%

Wenn der NoSuchElementException -Test fehlschlägt, gibt es keine Ausnahme, p.x > 1000 ist nur locPopPair .

    
Steve Waldman 31.12.2015 12:19
quelle
3

Sie können .fold :

%Vor%

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:

%Vor%     
Marth 31.12.2015 11:19
quelle
1

Ich denke, Sie können wie folgt vorgehen.

%Vor%     
cchantep 31.12.2015 11:08
quelle

Tags und Links