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!
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.
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:
Und die Ausgabe ist:
%Vor%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.
Tags und Links scala functional-programming monads either