Was ist der Unterschied zwischen Try und Entweder?

7

Laut der Dokumentation :

  

Der Try-Typ repräsentiert eine Berechnung, die entweder zu einem führen kann   Ausnahme oder gibt einen erfolgreich berechneten Wert zurück. Es ist ähnlich wie   aber semantisch verschieden von der scala.util.Either Art.

Die Dokumente gehen nicht näher darauf ein, was der semantische Unterschied ist. Beide scheinen in der Lage zu sein, Erfolge und Misserfolge zu kommunizieren. Warum würdest du eins über dem anderen benutzen?

    
Peter Bratton 21.04.2015, 17:25
quelle

5 Antworten

20

Ich habe die Beziehung zwischen Try , Either und Option in diese Antwort . Die Highlights von dort bezüglich der Beziehung zwischen Try und Either sind im Folgenden zusammengefasst:

Try[A] ist isomorph zu Either[Throwable, A] . Mit anderen Worten, Sie können eine Try als Either mit einem linken Typ von Throwable behandeln, und Sie können jede Either mit einem linken Typ von Throwable als Try behandeln. Es ist üblich, Left für Fehler und Right für Erfolge zu verwenden.

Natürlich können Sie Either auch breiter verwenden, nicht nur in Situationen mit fehlenden oder außergewöhnlichen Werten. Es gibt andere Situationen, in denen Either dazu beitragen kann, die Semantik eines einfachen Unionstyps auszudrücken (wobei der Wert einer von zwei Typen ist).

Semantisch könnten Sie Try verwenden, um anzugeben, dass der Vorgang möglicherweise fehlschlägt. Sie könnten auch Either in einer solchen Situation verwenden, insbesondere wenn Ihr "Fehler" -Typ etwas anderes ist als Throwable (z. B. Either[ErrorType, SuccessType] ). Und dann können Sie auch Either verwenden, wenn Sie mit einem Union-Typ arbeiten (z. B. Either[PossibleType1, PossibleType2] ).

Die Standardbibliothek enthält nicht die Konvertierungen von Either nach Try oder von Try nach Either , aber es ist ziemlich einfach, Try und Either nach Bedarf anzureichern:

%Vor%

Damit können Sie Folgendes tun:

%Vor%     
Ben Reich 21.04.2015, 17:35
quelle
7

Um Ihre Frage zu beantworten: "Was ist der semantische Unterschied ":

Dies bezieht sich wahrscheinlich auf "flatMap" und "map", die in "Entweder" nicht vorhanden sind und Fehler entweder weiterleiten oder den Erfolgswert in Try zuordnen. Dies ermöglicht zum Beispiel die Verkettung wie

%Vor%

was genau das tut, was Sie hoffen würden - gibt ein Try zurück, das entweder die erste Ausnahme oder das Ergebnis enthält.

Try hat viele andere nützliche Methoden, und natürlich seine Methode, um die Anwendung zu vereinfachen - Exception Handling.

Wenn Sie wirklich überwältigt sein wollen, gibt es zwei andere Klassen, die für diese Art von Anwendung interessant sein könnten. Scalaz hat eine Klasse namens " \ / "(früher bekannt als Prince), ausgesprochen" Entweder ", was meistens wie Entweder ist, aber flatMap und map arbeiten auf dem richtigen Wert. Ähnlich und nicht Scalactic hat eine " Oder "das ist auch ähnlich wie Beides, aber flatMap und map arbeiten mit dem Left-Wert.

Ich empfehle Scalaz nicht für Anfänger.

    
Ed Staub 21.04.2015 18:40
quelle
2

Either impliziert nicht Erfolg und Misserfolg, es ist nur ein Container für entweder A oder B. Es ist üblich, es zu verwenden, um Erfolge und Misserfolge darzustellen, wobei die Konvention darin besteht, den Fehler auf die linke Seite zu setzen, und der Erfolg auf der rechten Seite.

A Try kann als Either angesehen werden, wobei der linke Typ auf Throwable gesetzt ist. Try[A] entspricht Either[Throwable, A] .

Verwenden Sie Try , um einen möglichen Fehler in der Berechnung eindeutig zu identifizieren, wobei der Fehler durch eine Ausnahme dargestellt wird. Wenn Sie den Fehler mit einem anderen Typ (z. B. einem String oder einem Satz von Fallklassen, die ein versiegeltes Merkmal erweitern) darstellen möchten, verwenden Sie Either .

    
vptheron 21.04.2015 17:36
quelle
1

Either ist allgemeiner, da es einfach disjunkte Typenverknüpfungen darstellt. Insbesondere kann es eine Vereinigung gültiger Rückgabewerte eines Typs X und Exception darstellen. Es wird jedoch nicht versucht, Ausnahmen selbst zu erfassen. Sie müssen try-catch-Blöcke um gefährlichen Code hinzufügen und dann sicherstellen, dass jeder Zweig eine entsprechende Unterklasse von Either zurückgibt (normalerweise: Left für Fehler, Right für erfolgreiche Berechnungen).

Try[X] kann man sich als Either[Exception, X] vorstellen, aber es fängt auch Exceptions ab.

    
Andrey Tyukin 21.04.2015 17:37
quelle
1

Either[X, Y] Verwendung ist allgemeiner. Wie sein Name sagt, kann er entweder ein Objekt vom Typ X oder von Y darstellen.

Try[X] hat nur einen Typ und kann entweder ein Erfolg [X] oder ein Fehler sein (der ein Throwable enthält).

Irgendwann wird Try[X] als Either[Throwable,X]

angezeigt

Was ist schön an Try[X] ist, dass Sie weitere Operationen verketten können, wenn es wirklich ein Erfolg ist, werden sie ausgeführt, wenn es ein Fehler war, werden sie nicht

%Vor%

Natürlich kannst du immer online wie

%Vor%     
Claudio 21.04.2015 17:37
quelle

Tags und Links