Ergänzen des Ergebnistyps in Fortsetzungen

8

Ist es möglich, einige Typen aus dem folgenden Code zu entfernen:

%Vor%

track Funktion verfolgt Aufrufe von tracked in Int Instanzen (z. B. 7.tracked ).

Ist es möglich, den Typ-Parameter auf tracked implizit zu ermitteln, so würde Folgendes kompiliert:

%Vor%     
miah 28.05.2012, 07:44
quelle

2 Antworten

2

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.

    
huynhjl 10.04.2013, 06:13
quelle
1

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:

  • -Xprint: zeigt Ihren Scala-Code, nachdem eine bestimmte Phase ausgeführt wurde
  • -Xprint: -Yshow-trees zeigt Ihren Scala-Code und die Bäume nach der Phase wurden ausgeführt
  • -YBrowse: öffnet eine GUI, um beide zu surfen.
Edmondo1984 10.07.2012 07:41
quelle