Reduzierung von Iterable [Entweder [A, B]] zu Entweder [A, Iterable [B]]

8

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?

    
Filippo De Luca 28.10.2012, 21:04
quelle

3 Antworten

11

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:

%Vor%

Jetzt bekommen wir:

%Vor%

Sie können sequence auch in einer Liste von Option s, Promise s usw. verwenden.

    
Travis Brown 28.10.2012, 21:48
quelle
4

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%     
Kim Stebel 28.10.2012 21:43
quelle
2

Ich finde return -Anweisungen immer ein wenig peinlich, aber das folgende funktioniert:

%Vor%     
0__ 28.10.2012 21:24
quelle