Future [Option [Boolean]] in einem für das Verständnis .. Einfach oder?

8

Angenommen, ich habe:

%Vor%

und ich kann:

%Vor%

Ich denke, das zum Verständnis dafür wäre:

%Vor%

aber das funktioniert nicht! Ich erhalte einen Fehler, zB:

%Vor%

Wie verwende ich eine Future [Option [Boolean]], um das Boolean zu extrahieren oder zu konvertieren?

Hinweis: Dies ist eine Vereinfachung des Problems, das ich im Moment mit vielen Future [Option [Boolean]] Variablen habe, die ich gerne zusammen in einem verwenden möchte für das Verständnis.

    
Simon C 03.01.2014, 01:32
quelle

3 Antworten

12
Ein Verständnis dafür, dass es so aussieht, als ob alles funktionieren sollte, oder? Aber lass uns darüber nachdenken, was du verlangst.

Beachten Sie zuerst, dass for un-nests:

%Vor%

erzeugt

%Vor%

Jetzt, ohne auch nur in die Typ-Signaturen oder Entzuckerung zu kommen, können wir darüber nachdenken, List durch einen beliebigen Typ T zu ersetzen, und wir werden den enthaltenen Typ A :

aufrufen %Vor%

und wir sollten ein

bekommen %Vor%

zurück (vermutlich die, die wir hineingelegt haben, aber die Typen versprechen uns das nicht wirklich).

Okay, aber was ist mit

? %Vor%

? Dies ist strikt allgemeiner als der Fall, in dem die zwei Dinge die gleiche Verschachtelung haben. Nun, wenn T und U beide einen gemeinsamen Supertyp S haben, dann können wir die ganze Sache einfach als S(S(a: A)) betrachten, also erhalten wir zumindest S zurück. Aber was ist mit dem allgemeinen Fall?

Die Quintessenz ist, dass es abhängt . Betrachten wir zum Beispiel den Fall, in dem T=Future , U=Option . Wir haben folgende Möglichkeiten:

%Vor%

Können wir nun eine kohärente Politik für das Auspacken entwickeln? Wenn wir uns in Future entpacken, was A verwenden Sie dann für den Fall Success(None) ? Sie haben keine verfügbar, um zurückzukehren. Wenn du versuchst, das äußere Future zu vernichten, wie weißt du das, ohne es explizit dem Compiler mitzuteilen, dass Failure auf None abgebildet werden sollte (falls es das wirklich sollte - vielleicht sollte es gehen ein Standard!).

Das Entscheidende ist, dass Sie das nicht im Allgemeinen richtig machen können, ohne zu spezifizieren, was für jedes Paar T[U[_]] passieren soll. (Ich ermutige den interessierten Leser, Tutorials auf Monaden und zu lesen Monade-Transformer .)

Es gibt jedoch einen Ausweg: Wenn Sie Ihre U explizit in eine T oder Ihre T in Ihre U umwandeln können, können Sie die Vorteile der Entpackungsfunktion nutzen. Es ist ziemlich einfach, ein Option in ein Future zu verwandeln, also ist die einfachste Lösung

%Vor%

(wo die Ausnahme nur auf none.get geworfen wird). Alternativ können Sie das Future in ein Option mit dem etwas hässlichen

verwandeln %Vor%     
Rex Kerr 03.01.2014, 04:03
quelle
8

Entsprechender Code für

%Vor%

ist nicht

%Vor%

aber

%Vor%

Und es macht in diesem Fall keinen Sinn.

Für die Kette von map s könnten Sie verschachtelte for-comprehensions

verwenden %Vor%

Aber map sieht besser aus.

    
senia 03.01.2014 01:39
quelle
5

Nun, for comprehensions täuschen in der Art, wie sie aussehen. Ihr Verständnis erweitert sich zu:

%Vor%

Was offensichtlich falsch ist, da flatMap einen Rückgabetyp von Future[T] erwartet und Sie Option[Unit]

angeben

Obwohl Sie manchmal für die Code-Ordnung eine einzelne for -Schleife mit vielen solchen Ausdrücken haben möchten. In diesen Fällen könnten Sie:

%Vor%

Das obige erzeugt:

%Vor%

Bearbeiten: Obwohl Sie alle Schmerzen nehmen müssen, wenn Sie yield verwenden. Wenn Sie for comprehension nicht als Ausdruck verwenden möchten, können Sie wie gewünscht vorgehen:

%Vor%

Auf diese Weise ist keine implizite erforderlich. Der Compiler verwendet foreach an jeder Junction. -Xprint:typer gibt:

%Vor%     
Jatin 03.01.2014 01:47
quelle

Tags und Links