Ein interessantes Diskussion über die Unterscheidung zwischen Rückrufen und Fortsetzungen bei SO hat diese Frage aufgeworfen. Per Definition ist eine Fortsetzung eine abstrakte Darstellung der Logik, die zur Vervollständigung einer Berechnung benötigt wird. In den meisten Sprachen wird dies als eine Prozedur mit einem Argument dargestellt, an die Sie den Wert übergeben, der weiter verarbeitet werden muss.
In einer rein funktionalen Sprache (in der alle Funktionen reine und erstklassige Bürger sind) würde ich denken, dass eine Fortsetzung vollständig als Funktion modelliert werden könnte. So habe ich ja bisher Fortsetzungen verstanden. Die Welt ist jedoch staatlich (seufzend) und die allgemeine Definition erfordert nicht, dass ein Programmstatus für die Fortsetzung erfasst wird - es muss nur die Absicht umfassen.
Kann zum besseren Verständnis ein Beispiel in einer funktionalen Sprache angegeben werden, in der die Fortsetzung abstrakter ausgedrückt wird als eine Funktion? Ich weiß, dass Scheme es Ihnen ermöglicht, die aktuelle Fortsetzung auf erstklassige Weise zu erfassen (call / cc), aber trotzdem scheint es, dass die Prozedur mit einem Argument, die an call / cc übergeben wird, einfach die aktuelle Fortsetzung in Form einer anderen gegeben wird Argumentprozedur, auf die die Funktion call / cc'd das Ergebnis anwenden kann.
quelle
Antworten:
tl; dr; Der Typ ist die übergreifende Abstraktion über eine Fortsetzung
Eine Fortsetzung ist die Art ihrer Ein- und Ausgänge
Das, was Sie einer nicht prozedurbasierten Fortsetzung am nächsten kommen, ist wahrscheinlich die Fortsetzungsmonade in Haskell, da sie als Typ ausgedrückt wird, für den viele Funktionen verwendet werden können, um mit dem Typ zu interagieren, um ihn zu unterbrechen, fortzusetzen, zurückzuverfolgen usw.
Sie können diesen Verschluss in einer Art, wie die kapseln
Cont
Typ in Haskell , wo Sie die Monade Abstraktion als „höhere Ebene Abstraktion“ erhalten, und es gibt andere Formen der Abstraktion über Fortsetzungen erhalten Sie , wenn Sie auf die Fortsetzung als aussehen Art statt Zum Beispiel einfach eine ProzedurAbschluss vs. Verfahren
Am Ende des Tages haben Sie im Grunde recht; Eine Fortsetzung ist eine "Prozedur", obwohl ich sie eher als Abschluß bezeichnen würde. Oft werden Fortsetzungen am besten als erstklassige Abschlüsse ausgedrückt, die eine gebundene Umgebung umschlossen haben. In einer reinen funktionalen Sprache könnte man sagen, dass dies nicht besonders sinnvoll ist, weil Sie keine Referenzen haben. Dies ist wahr, aber Sie können Werte einschließen, und durch eine einzelne Zuweisung wird das Einschließen des Werts gegenüber der Referenz genau gleich. Daraus ergibt sich in Haskell:
In einer Sprache, die nicht in der Lage ist, eine verbindliche Umgebung einzuschließen, fehlen möglicherweise technisch gesehen erstklassige Abschlüsse, aber selbst dann gibt es eine Umgebung (im Allgemeinen die globale), die für den Abschluss verfügbar ist.
Daher würde ich sagen, dass es genauer ist, eine Fortsetzung wie folgt zu beschreiben: Ein Verschluss, der auf eine bestimmte Art und Weise verwendet wird.
Fazit
Auf die Frage "Ist eine Fortsetzung anders als durch eine Prozedur umsetzbar?" Nein. Wenn Sie keine First-Class-Funktionen haben, können Sie wirklich keine Fortsetzungen als solche haben (Ja, Funktionszeiger zählen als First-Class-Funktionen, sodass alternativ ein beliebiger Speicherzugriff ausreichen kann).
Nun zur Frage "Gibt es Möglichkeiten, eine Fortsetzung abstrakter auszudrücken als eine Prozedur?" Wenn Sie es als Typ ausdrücken, erhalten Sie eine viel größere Abstraktion, sodass Sie die Fortsetzung auf sehr allgemeine Weise behandeln können, sodass Sie mit der Fortsetzung auf viel mehr Arten interagieren können, als nur sie auszuführen.
quelle
Ein Beispiel, das Ihnen gefallen könnte, sind Koroutinen. Die Coroutinen von Lua oder die Iteratoren / Generatoren von Python oder C # haben beispielsweise eine ähnliche Leistung wie One-Shot-Fortsetzungen (Fortsetzungen, die Sie nur einmal aufrufen dürfen), die Fortsetzung wird jedoch nicht explizit in eine Funktion umgewandelt. Stattdessen haben Sie Möglichkeiten, die Coroutine bis zur nächsten "Yield" -Anweisung zu verschieben.
Betrachten Sie beispielsweise das folgende Python-Programm:
Es ähnelt dem folgenden Javascript-Programm mit expliziten Rückrufen:
Das Javascript-Beispiel ist etwas verrauscht, weil jeder Schritt zusätzlich zur Rückgabe des ermittelten Werts die nächste Fortsetzung zurückgeben muss (in Python wird die Fortsetzung im ite verfolgt)
quelle