Verkettungsmethode ruft mit Entweder auf

8

Ich würde gerne wissen, ob es möglich ist, eine Art "Methoden-Aufrufkette" zu erstellen, wobei alle Methoden dasselbe Ergebnis liefern. Entweder [Fehler, Ergebnis].

Was ich tun möchte, ist: alle Methoden sukzessive aufzurufen, und wenn die Methode einen Left (Error) zurückgibt, dann stoppe die Methodenaufrufe und gebe die erste Left in der Aufrufkette zurück.

Ich habe einige Sachen probiert, mit Falte, Karte, Projektionen ... aber ich bin neu bei Scala und finde keine elegante Lösung.

Ich habe so etwas probiert:

%Vor%

Aber es funktioniert nicht. Und überhaupt mag ich den Einzug nicht wirklich. Außerdem möchte ich den Fehler in einen neuen String umwandeln, der das Problem beschreibt (ich denke, ich sollte Falte verwenden?)

Ich suche nach etwas, das so geschrieben ist:

%Vor%

Kann man so etwas mit Scala machen? Vielleicht mit beiden Optionen und Option?

Eine Einschränkung wäre auch, dass, wenn der erste Anruf fehlschlägt, die anderen Anrufe nicht getätigt werden sollten. Ich möchte keine Lösung, bei der ich alles anrufe und mich dann den anderen anschließe.

Danke!

    
Sebastien Lorber 24.08.2012, 10:05
quelle

3 Antworten

11

Es gibt bessere, funktionellere Möglichkeiten, dies zu tun (meistens mit Scalaz 'Validierung und Traverse / Sequenz), aber Ihr Code entspricht ungefähr:

%Vor%

Was die Verschachtelung zumindest beseitigt. Da Scala's Either standardmäßig nicht richtig voreingenommen ist, müssen Sie dies manuell einige Male angeben, was die Lesbarkeit etwas verringert.

    
Debilski 24.08.2012, 10:35
quelle
5

Die RightProjection , die Sie bereits verwenden, ermöglicht es Ihnen mit der flatMap -Methode genau das zu tun, was Sie brauchen.

(Per Konvention werden Berechnungsergebnisse in Right und Fehlerwerte für fehlgeschlagene Berechnungen in Left gespeichert. Aber es gibt keinen anderen Grund, Sie könnten dasselbe mit LeftProjection machen.)

Eigentlich haben wir hier, dass RightProjection eine Monade bildet. Sie können einen Wert x mit Right(x).right in eine Projektion umwandeln. Und wenn Sie eine Projektion p haben, können Sie eine möglicherweise fehlerhafte Berechnung f auf p anwenden, indem Sie p.flatMap(f) aufrufen. Auf diese Weise können Sie mehrere solcher Methoden verketten.

Dies kann durch for comprehensions noch weiter vereinfacht werden. Um ein komplettes Beispiel zu geben:

%Vor%

Und die Ausgabe ist:

%Vor%     
Petr Pudlák 24.08.2012 12:20
quelle
2

Debilski hat "die" Antwort, wenn es funktionstüchtig ist, aber ich würde es mit einem Hilfscode weiter reduzieren:

%Vor%

In meinem Take müssen keine erfolgreichen Erstellungsereignisse protokolliert werden (nur die Fehler), da die gesamte Transaktion bei einem Fehler zurückgesetzt wird, aber YMMV, fügen Sie die Protokollierung hinzu, wie Sie möchten.

    
virtualeyes 24.08.2012 11:11
quelle