Wie konvertiert man Funktionen, die Exceptions auslösen, in Funktionen, die entweder zurückgeben?

8

Angenommen, ich habe einige Funktionen, die Ausnahmen auslösen. Ich verpacke sie, um Either[Throwable, <function return type>] zurückzugeben. (Nehmen wir an, ich brauche Either anstatt Try ).

%Vor%

Nun möchte ich einen generischen Wrapper schreiben, um den bolierpllate-Code loszuwerden. Was würdest du vorschlagen?

    
Michael 13.05.2014, 14:14
quelle

5 Antworten

4

Ich würde etwas von folgender Form schreiben:

%Vor%

aber das komponiert nicht. Try ist so viel schöner.

Aktualisiert: Wenn Sie immer nur mit der richtigen Projektion arbeiten wollen, dann geben Sie einfach die richtige Projektion zurück. Jetzt komponiert es.

    
wheaties 13.05.2014, 14:29
quelle
9

Jedes Mal, wenn Sie etwas generisches in Bezug auf Arity machen wollen, Shapeless hat wahrscheinlich das, was Sie brauchen. In diesem Fall können Sie Folgendes schreiben:

%Vor%

Nehmen wir an, wir haben eine unsichere Methode wie die folgende:

%Vor%

Wir können es umhüllen:

%Vor%

Und jetzt müssen wir uns nicht um Ausnahmen kümmern:

%Vor%

Dies funktioniert für jedes alte FunctionN .

    
Travis Brown 13.05.2014 15:18
quelle
3

Falls Sie Ihre ursprüngliche Funktionsdefinition nicht ändern wollen:

Benötigen Sie einen Wrapper, der für eine beliebige Anzahl von Argumenten funktioniert, oder geht es Ihnen gut mit einem generischen Wrapper für jede mögliche Anzahl von Argumenten? Im letzteren Fall können Sie Folgendes haben:

%Vor%

mit dem Sie eitherify(foo) , eitherify(bar) und so weiter machen können.

    
noziar 13.05.2014 14:34
quelle
3

Da Sie noch nicht genügend Auswahlmöglichkeiten haben, können Sie auch die ScalaUtils Methode verwenden. ScalaUtils ist eine sehr kleine, fokussierte Bibliothek, die Sie als Abhängigkeit hinzufügen können. Die Methode versuchen (die in dem org.scalautils-Paketobjekt ist) wird Ihnen einen Or-Typ geben, auf dem Sie ToEither aufrufen können. Ich habe zuerst vorgeschlagen, dies mit Try zu tun, so dass Sie keine Abhängigkeiten hinzufügen müssten, aber es scheint nicht die ToEither-Methode zu haben, was mich überrascht hat. Hier ist, wie es mit Or aussehen würde:

%Vor%

Entschuldigung, ich habe anfangs übersehen, dass Sie eine Methode wollten. Ich würde wahrscheinlich nur überladen wie Noziar vorgeschlagen:

%Vor%

Wenn Sie eine Überladung vermeiden wollen (und keine Form haben), dann ist die andere Alternative der Magnet Muster . Ich glaube, das würde dich auf eine sichere Methode bringen, aber ich denke, das Überladen wäre einfacher.

    
Bill Venners 13.05.2014 16:16
quelle
2

Scalaz hat eine rechtsgerichtete Either namens \/ , die auf Ihre Bedürfnisse zugeschnitten ist, wie Sie sie beschrieben haben. Sie können fromTryCatch für das Objekt \/ verwenden, um den genannten Textbaustein zu entfernen. Da \/ rechts-voreingenommen ist, kann es für Überschneidungen verwendet werden, die nach rechts verschoben sind.

Beispielverwendung könnte sein:

%Vor%

Der resultierende obige Typ wäre Throwable \/ A

    
gpampara 13.05.2014 14:52
quelle