Was ist der deal mit allen Entweder Reste?
Jeder Klasse sinnvoll erscheint und die Möglichkeiten der Verwendung es sind ziemlich offensichtlich. Aber dann schaue ich auf die API-Dokumentation, und ich bin verblüfft:
def joinLeft [A1 >: A, B1 >: B, C] (implicit ev: <:<[A1, Either[C, B1]]):
Either[C, B1]
Joins an Either through Left.
def joinRight [A1 >: A, B1 >: B, C] (implicit ev: <:<[B1, Either[A1, C]]):
Either[A1, C]
Joins an Either through Right.
def left : LeftProjection[A, B]
Projects this Either as a Left.
def right : RightProjection[A, B]
Projects this Either as a Right.
Was mache ich mit einer Projektion und wie kann ich selbst aufrufen den Beitritt?
Google nur Punkte die mir auf die API-Dokumentation.
Kann dies nur ein Fall von "keine Aufmerksamkeit auf den Mann hinter dem Vorhang", aber ich denke nicht so. Ich glaube, das ist wichtig.
- Obligatorischen Hinweis, dass
Try
ist Häufig einfacher zu verwenden alsEither
für exception handling, aber es war nicht verfügbar vor dem Scala 2.10. [scala-lang.org/api/current/scala/util/Try.html]
Du musst angemeldet sein, um einen Kommentar abzugeben.
left
undright
sind die wichtigsten.Either
ist nützlich, ohne Projektionen (meist tun Sie pattern-matching), sondern Projektionen sind, durchaus Aufmerksamkeit verdient, als Sie geben eine viel reichere API. Verwenden Sie verbindet viel weniger.Either
wird oft verwendet, um zu bedeuten, "einen richtigen Wert oder ein Fehler". In dieser Hinsicht ist es wie eine erweiterteOption
. Wenn keine Daten vorhanden sind, stattNone
Sie haben einen Fehler.Option
hat eine umfangreiche API. Das gleiche kann zur Verfügung gestellt werden, die aufEither
, vorausgesetzt, wir wissen,,, was ist das Ergebnis und welches ist der Fehler.left
undright
Projektion sagt nur, dass. Es ist dieEither
, plus dem zusätzlichen wissen, dass der Wert jeweils Links oder rechts, und der andere ist der Fehler.Beispielsweise in
Option
können Sie anzeigen, soopt.map(f)
gibt einOption
mitf
angewendet, um den Wert vonopt
wenn es eine eins, und nochNone
wennopt
warNone
. Auf der linken Projektion, es giltf
auf den value-at-Links, wenn es einLeft
, und lassen Sie es unverändert, wenn es eineRight
. Beachten Sie die Signaturen:LeftProjection[A,B]
,map[C](f: A => C): Either[C,B]
RightProjection[A,B]
,map[C](f: B => C): Either[A,C]
.left
undright
sind einfach die Art und Weise zu sagen, die Seite ist als der Wert, wenn Sie verwenden möchten, eine der üblichen API-Routinen.Alternativen hätte:
map
zum Beispiel), tun einswap
vor und nach.for
Verstehens (flatMap
in der Tat, aber die für die notation ist sehr bequem)Either
ist eine alternative für (checked) exceptions.Nun die verbindet. Links und Rechts bedeutet das gleiche wie für die Projektionen, und Sie sind eng mit
flatMap
. BetrachtenjoinLeft
. Die Unterschrift kann verwirrend sein:A1
undB1
sind technisch notwendig, aber nicht entscheidend für das Verständnis, wir vereinfachenWas implizit bedeutet, dass die Methode kann nur aufgerufen werden, wenn
A
ist einEither[C,B]
. Die Methode ist nicht auf eineEither[A,B]
im Allgemeinen, sondern nur auf eineEither[Either[C,B], B]
. Als mit der linken Projektion, betrachten wir, dass der Wert auf der linken Seite (das wäre das richtige fürjoinRight
). Was die Verknüpfung tut, ist, glätten Sie diese (denkeflatMap
). Wenn man mitmachen, man kümmert sich nicht, ob der Fehler (B) innen oder außen, wir wollen nur, dass Entweder[C,B]. Also Links(Links(c)) ergibt sich Links(c), Links(Rechts(b)) und Rechten(b) Ausbeute Rechts(b). Die Beziehung mit flatMap ist wie folgt:Den
Option
gleichwertig funktionieren würde, auf einOption[Option[A]]
,Some(Some(x))
ergeben würdeSome(x)
beideSome(None)
undNone
ergeben würdeNone
. Es kann geschrieben werden a -.flatMap(Identität). Beachten Sie, dassOption[A]
ist isomorph zuEither[A,Unit]
(wenn Sie verwenden Sie die Links Projektionen und joins) und auchEither[Unit, A]
(mit Recht Hochrechnungen).Ignorieren die Verknüpfungen für jetzt, Projektionen sind ein Mechanismus, so dass Sie verwenden Sie verwenden Sie eine
Either
als Monade. Betrachten Sie es als die Extraktion entweder auf der linken oder auf der rechten Seite in eineOption
, aber , ohne die andere SeiteWie immer, das wohl mehr Sinn macht, mit einem Beispiel. So stellen Sie sich vor Sie haben eine
Either[Exception, Int]
und konvertieren wollen dieException
zu einemString
(falls vorhanden)Diese Karte wird über die linke Seite führen, so dass Sie eine
Either[String,Int]
joinLeft
undjoinRight
aktivieren Sie "glätten" einer geschachteltenEither
:Edit: Meine Antwort auf diese Frage zeigt ein Beispiel, wie man mit Hilfe der Projektionen, in diesem Fall Falten Sie zusammen eine Folge von
Either
s ohne pattern-matching oder rufenisLeft
oderisRight
. Wenn Sie vertraut sind mit der VerwendungOption
ohne Abgleich oder die BerufungisDefined
es analagous.Während Sie neugierig mit Blick auf die aktuelle Quelle Entweder, sah ich, dass
joinLeft
undjoinRight
implementiert, mit pattern-matching. Allerdings stolperte ich über diese ältere version der source und sah, dass es um die Umsetzung der join-Methoden unter Verwendung von Projektionen:Mein Vorschlag ist, fügen Sie den folgenden, um Ihre utility-Paket:
Meiner Erfahrung nach die einzig sinnvolle Methode ist, Falten. Sie nicht wirklich nutzen isLeft oder isRight in funktionalen code. joinLeft und joinRight könnte nützlich sein, als flatten Funktionen wie erläutert durch Dider Dupont, aber ich hatte noch keine Gelegenheit, Sie zu benutzen auf diese Weise. Das oben genannte ist die Verwendung Entweder als Recht voreingenommen, was ich vermute, ist, wie die meisten Menschen Sie verwenden. Es ist wie eine Option mit einem Fehlerwert statt None.
Hier sind einige von meinen eigenen code. Entschuldigt, das Ihr nicht Poliert-code, aber seine ein Beispiel für die Verwendung Entweder in einem für das Verständnis. Die Zugabe der map-und flatMap-Methoden erlaubt uns, verwenden die Besondere syntax, die für Verstehens. Seine Analyse der HTTP-Header, entweder durch Rückgabe eines Http-und Html-Fehler-Seite-Antwort oder ausgewertete benutzerdefinierte HTTP-Request-Objekt. Ohne die Verwendung der für das Verständnis der code wäre sehr schwer zu begreifen.