Ihre Frage ließ mich darüber nachdenken, wie Fortsetzungen den Zustand verfolgen können. Also habe ich das an Ihren Fall angepasst und kam auf folgendes:
%Vor%Dies verwendet 2.10.1, aber es funktioniert auch mit 2.9.1, vorausgesetzt, Sie ersetzen die 2.10.x implizite Wertklasse mit:
%Vor% Die Schlüsseländerung, die ich vorgenommen habe, besteht darin, dass tracked
keine Typrückschlüsse verwendet, die auf Int@cps[ST]
festgelegt werden. Das CPS-Plugin ordnet dann die Berechnung dem richtigen Typ zu (wie String@cps[ST]
). Der Zustand wird durch die Fortsetzung eingefädelt, wobei eine State=>State
-Funktion zurückgegeben wird, die den aktuellen Zustand (die Menge von Ints) annimmt und den nächsten Zustand zurückgibt. Der Rückgabetyp des Zurücksetzens ist eine Funktion von Zustand zu Zustand (vom Typ ST
), die den Anfangszustand annimmt und den endgültigen Zustand zurückgibt.
Der letzte Trick besteht darin, eine Variable zu verwenden, um das Ergebnis zu erfassen, während der erwartete Typ für reset
beibehalten wird.
Während die genaue Antwort auf diese Frage nur von den Autoren des Compilers gegeben werden kann, können wir erraten, dass es nicht möglich ist, den Quellcode des Fortsetzungs-Plugins zu betrachten.
Wenn Sie sich die Quelle der Fortsetzungen anschauen, können Sie dies sehen:
%Vor%Die anfPhase-Phase wird nach der Abbeizphase und die cpsPhase nach selectiveAnf ausgeführt. Wenn Sie auf SelectiveANTransform.scala schauen
%Vor%Wenn wir scalac -Xshow-Phasen verwenden, können wir die Phasen während des Kompilierungsprozesses sehen:
%Vor%Wie Sie sehen können, wird die Typerphase vor den Phasen selectiveAnf und selectiveCps angewendet. Es sollte bestätigt werden, dass Typinferenz in der Typer-Phase auftritt, aber wenn dies wirklich der Fall ist und es sinnvoll wäre, sollte jetzt klar sein, warum Sie den Int-Typ auf 7.tracked und 35.tracked nicht weglassen können / p>
Wenn Sie jetzt noch nicht zufrieden sind, sollten Sie wissen, dass der Compiler mit einer Reihe von Transformationen auf "Bäumen" arbeitet, die Sie möglicherweise mit folgenden Optionen suchen:
Tags und Links scala type-inference continuations