Frage

Ich kämpfe darum zu verstehen, was genau es bedeutet, wenn ein Wert Typ hat A @cpsParam[B,C] Und welche Arten dieses Formulars soll ich meinen Werten zuweisen, wenn ich die abgrenzte Kontinuationseinrichtung verwendete.

Ich habe mir einige Quellen angesehen:

http://lamp.epfl.ch/~rompf/continuations-icfp09.pdf

http://www.scala-lang.org/node/2096

http://dcsobral.blogspot.com/2009/07/delimited-continuations-explained-in.html

http://blog.richdougherty.com/2009/02/delimited-continuations-in-scala_24.html

Aber sie gaben mir nicht viel Intuition in das. Im letzten Link versucht der Autor, eine explizite Erklärung zu geben, aber es ist sowieso nicht klar genug.

Das A hier repräsentiert die Ausgabe der Berechnung, die auch die Eingabe für ihre Fortsetzung ist. Das B repräsentiert den Rückgabetyp dieser Fortsetzung, und das C repräsentiert seinen "endgültigen" Rückgabetyp - denn die Verschiebung kann den zurückgegebenen Wert weiter verarbeiten und seinen Typ ändern.

Ich verstehe den Unterschied zwischen "Ausgabe der Berechnung", "Rückgabetyp der Fortsetzung" und "endgültiger Rückgabetyp der Fortsetzung". Sie klingen wie Synonyme.

War es hilfreich?

Lösung

Also haben mir die Leute anderswo geholfen. Hier ist die Antwort:

reset ({
    ...
    ...shift((k:A=>B) => ...::C)::A...
    ...
}::B)::C

So, shift ist ein Loch des Typs A in einer Berechnung {...} vom Typ B. Das Argument von shift Gibt einen Wert des Typs zurück C Und deshalb reset ({...}) hat Typ C.

Der Schlüsseltrick beim Verständnis dieses Zeug war, das zu sehen {...} und reset {...} haben unterschiedlichen Typen, je nachdem, welchen Typ der Typ shiftDas Argument kehrt zurück.

Zum Beispiel:

reset ({
    "number "+shift((k:Int=>String) => List(k(1), k(2), k(3)))
})

kehrt zurück List("number 1", "number 2", "number 3").

Hier A ist Int, B ist String, C ist List[String] Weil {"number" + _} ist (hier) eine Funktion von Int zu String und das Argument von shift, Angesichts dieser Funktion erzeugt a List[String], was zu Ergebnis der reset({...}).

Andere Tipps

Ich bin immer noch in dem Prozess, die genauen Typisierungsregeln/-auswirkungen hier herauszufinden.

Es erscheint einfach/einfacher, wenn die Typen in den Beispielen "einfach genug" sind, um wie oben gezeigt "gut zu passen", aber es wird (zumindest für mich) beim Vergleich von Dingen mit dem Tipping von Tiark Rompf (zumindest für mich):

|- e: A@cpsParam[B,C]; {[|r|]}: U
-----------------------------------------------------
[|val x: A = e; r|] = [|e|].map( (x: A) => {[|r|]} )

Also das Ergebnis von [|e|].map( (x: A) => {[|r|]} ) wird den Typ haben Shift[U,B,C] Nach der Definition der Karte in Tiarks Papier.

Hier ist du nicht unbedingt dasselbe wie B.

Bisher verstehe ich nicht, warum Sie sich von B unterscheiden dürfen, ohne so etwas wieU <: B in der Definition von MAP in Tiarks Papier gegeben.

Was fehlt mir hier wiederverständlich?

Irgendwelche Tipps/Ideen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top