Wie werden Futures kategorietheoretisch beschrieben?

Antworten:

25

Wie es passiert, schreibe ich gerade einen Artikel darüber. IMO, eine gute Möglichkeit, über Zukünfte oder Versprechungen nachzudenken, ist die Curry-Howard-Entsprechung für zeitliche Logik .

Grundsätzlich besteht die Idee hinter Futures darin, dass es sich um eine Datenstruktur handelt, die eine laufende Berechnung darstellt und mit der Sie synchronisieren können. In Bezug auf die zeitliche Logik ist dies die schließlich Operator EIN . Dies hat eine monadischen Struktur:

return:EINEINbichnd:(EINB)EINB
, in dem die returnBetrieb startet ein Prozess , dass unmittelbar ihr Argument zurückgibt, und erzeugt ein neues Verfahren , das für wartet einen ‚S - Wert, gilt f auf diesen Wert, und wartet dann auf den B - Wert vor der Rückkehr. Der Promises / A-Vorschlag für CommonJS nennt die monadische Bindeoperation , und Scala 2.10 gibt ihr lediglich die standardmäßige monadische Schnittstelle .bichndeinfBthen

Die duale zum schließlich Operator ist der immer Operator A der zeitlichen Logik, die besagt , dass man in jedem Augenblick einen bekommt ein . Wenn Sie von einer Kripke-Semantik der zeitlichen Logik (bei der Sie nur die Beweisbarkeit modellieren) zu einer kategorialen Semantik eines λ- Kalküls übergehen (bei der Sie auch Lambda-Terme / Beweise modellieren), gibt es tatsächlich mehrere Möglichkeiten, dies zu tun.EINEINEINλ

AEINEINEIN

Am natürlichsten ist es, , wodurch Sie zu jedem Zeitpunkt ein (möglicherweise anderes) . Dann können Sie den comonadischen Stil der funktionalen reaktiven Programmierung (FRP) (zuerst vorgeschlagen von Tarmo Uustalu und Varmo Vene ) als den dualen bis monadischen Stil der Programmierung mit Zukunft sehen.AEINStreeinmEINEIN

Der comonadic -calculus, wie sie vermuten lassen, führt trotz seiner Eleganz zu einem gravierenden Ausdrucksverlust in Bezug auf die explizite Programmierung mit Streams, da die Kategorie der von ihnen verwendeten freien Kohlegebren zu wenige globale Elemente aufweist, um viele interessante Programme zu bezeichnen , vor allem Fixpunkte.λ

Nick Benton und ich haben in unserer Arbeit Ultrametric Semantics of Reactive Programs dafür plädiert, explizit mit Streams zu programmieren . Anschließend schlug Alan Jeffrey die Verwendung von LTL als Typensystem in seiner Arbeit LTL types FRP vor , eine Beobachtung, die Wolfgang Jeltsch auch in seiner Arbeit Towards a Common Categorical Semantics for Linear-Time Temporal Logic und Functional Reactive Programming machte .

Der Unterschied zwischen der Ansicht Nick und ich nehme, und der Computer , Alan und Wolfgang Take wird am besten verstanden , (IMO) durch den Aufbau in Birkedal et gegeben Vergleich ALs. Die ersten Schritte in der synthetischen bewachten Domäne Theorie: Schritt-Indizierung in den Topos von Bäumen mit Alans Papier. Die Topos von Bäumen (Prägarben über der natürlichen Anzahl, sortiert nach Größe) sind der von Nick und mir verwendeten Kategorie von ultrametrischen Räumen sehr ähnlich, lassen sich jedoch viel einfacher mit der von Alan (Prägarben über eine diskrete Zeitkategorie) vergleichen, da beide Prägarben sind Kategorien.

Wenn Sie an Futures speziell für Parallelität interessiert sind, ist es möglicherweise eine bessere Idee, sich CTL als LTL anzusehen . AFAIK, das ist derzeit unerforschtes Gebiet!

BEARBEITEN: Hier ist ein Link zum Entwurf . In dem Artikel geht es hauptsächlich um die Implementierung von typisiertem FRP, daher ist die Sprache synchron. Der größte Teil der Diskussion über Zukünfte / Ereignisse in Abschnitt 3.3 sollte jedoch grundsätzlich auch für wirklich konkurrierende Sprachen gelten.

Neel Krishnaswami
quelle
1
Ich würde gerne eine Kopie davon bekommen, wenn Sie fertig sind.
Dave Clarke
1
EINEIN
Ich habe kürzlich gelesen, dass Scala Try[T]und Future[T]Dual sind, aber ich habe nicht ganz verstanden, was dies bedeutet / in welchem ​​Sinne.
Giorgio