Ich muss ein Iterable [Entweder [Throwable, String]] auf ein Entweder [Throwable, Iterable [String]] reduzieren. Ich weiß nicht, ob diese Operation ziemlich üblich ist oder nicht, habe nichts auf der Iterable Eigenschaft gefunden. Also habe ich diese Funktion geschrieben:
%Vor%Kann jemand mir helfen, einen besseren Weg zu finden, wenn dieser nicht ist?
Diese Operation wird oft als sequencing bezeichnet und ist in den Standardbibliotheken einiger funktionaler Sprachen (wie Haskell) verfügbar. In Scala können Sie entweder Ihre eigenen implementieren oder eine externe Bibliothek wie Scalaz verwenden. Angenommen, wir haben zum Beispiel folgendes:
%Vor%Jetzt können wir schreiben (mit Scalaz 7):
%Vor%Wie gewünscht.
Als eine Randnotiz erfordert diese Operation nur, dass der äußere Behälter verfahrbar ist und dass der innere Behälter ein anwendungsfähiger Funktor sein muss. Scalaz bietet auch eine ValidationNEL
-Klasse, die sehr ähnlich wie Either
ist und auch diese Anforderungen erfüllt, aber die Verwendung von sequence
in einer Liste von ValidationNEL
s sammelt mehrere Fehler anstatt am ersten zu stoppen:
Jetzt bekommen wir:
%Vor% Sie können sequence
auch in einer Liste von Option
s, Promise
s usw. verwenden.
Wenn Sie die explizite Rückgabe nicht mögen und den Musterabgleich bei einer etwas kürzeren Code-Länge vermeiden möchten, finden Sie hier eine andere Version:
%Vor%Tags und Links scala functional-programming either iterable