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.
Beachten Sie zuerst, dass for
un-nests:
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
:
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:
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
(wo die Ausnahme nur auf none.get
geworfen wird). Alternativ können Sie das Future
in ein Option
mit dem etwas hässlichen
Nun, for
comprehensions täuschen in der Art, wie sie aussehen. Ihr Verständnis erweitert sich zu:
Was offensichtlich falsch ist, da flatMap
einen Rückgabetyp von Future[T]
erwartet und Sie Option[Unit]
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:
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:
Auf diese Weise ist keine implizite erforderlich. Der Compiler verwendet foreach
an jeder Junction. -Xprint:typer
gibt:
Tags und Links scala for-comprehension