Wiederaufnahmebasierte E / A-Systeme?

8

Ich habe in letzter Zeit mit Wiederaufnahmen herumgespielt, hauptsächlich aus Abramskys klassischem Artikel Retracing Some Paths in Process Algebra . Sie sind ziemlich geschickt (im Grunde genommen Lösungen für die Domänengleichung ) und erinnern sehr an Kahn-Netzwerke.R=I(O×R)

Natürlich ist diese Beobachtung für mich nicht originell - sie bilden eine verfolgte monoidale Kategorie, und diese Tatsache wurde von Abramsky und Jagadeesan verwendet , um der linearen Logik Semantik zu verleihen. Beachten Sie auf jeden Fall, dass Sie, wenn Sie eine Wiederaufnahme einer Eingabe vom Typ zuführen , eine Ausgabe vom Typ O und eine aktualisierte Wiederaufnahme r 'erhalten . Auf diese Weise können Sie die Tatsache modellieren, dass sich ein Datenflussknoten ändern kann, wenn er Eingaben sieht Komm herein.ichrichÖr'

Infolgedessen scheint es, als könnten sie eine nette API zum Erstellen von E / A-Wandlern in einer Sprache höherer Ordnung wie ML oder Haskell bereitstellen, aber ich kann anscheinend keine Papiere finden, die so etwas beschreiben. Aber sie gibt es schon seit Jahrzehnten, und Gordon Plotkin hat sie erfunden. Es ist also nicht so, als wären sie im Dunkeln gelitten. Also fragte ich mich, ob jemand gesehen hatte, wie sie für solche Zwecke eingesetzt wurden.

Neel Krishnaswami
quelle
2
Als ich die Frage las, dachte ich mir: "Ich wette, Neel wird diese Frage beantworten."
Andrej Bauer
Dies könnte ein guter Anwendungsfall für Operationen und Handler im Eff-Stil sein.
Andrej Bauer
@AndrejBauer: Das denke ich immer bei Neels Fragen.
Dave Clarke

Antworten:

7

Dies ähnelt stark der E / A-API, die von Felleisen et al. In A Functional I / O System (oder Fun for Freshman Kids) beschrieben wurde . Grundsätzlich schreiben Sie (in der einfacheren, nicht verteilten Einstellung) eine Reihe von Ereignishandlern, von denen jeder den aktuellen Status akzeptiert und einen aktualisierten Status zurückgibt. Schließlich gibt es einen to-drawHandler, der die "Ausgabe" für jeden Zustand erzeugt.

Wenn wir diese API geringfügig neu formulieren, können wir die Handler und den aktuellen Status zusammenfassen und jedes Mal, wenn ein Handler sowohl einen neuen Status als auch einen neuen Satz von Handlern zurückgibt. Wir könnten dieses Paket von Status und Operationen als "Objekt" bezeichnen. :) Wenn wir dann das Ergebnis zu einem Paar dieses Objekts und der "Ausgabe" machen, dann haben wir genau die Art der Wiederaufnahmen.

Interessanterweise tun Felleisen et al. In der Arbeit genau dies, wenn sie zur verteilten Einstellung wechseln - jede Operation gibt ein Paar neuer Zustände und "Ausgaben" in Form von Nachrichten zurück, die an die anderen Teilnehmer im System gesendet werden sollen.

Sam Tobin-Hochstadt
quelle
5

Bin gerade auf diesen Beitrag gestoßen.

Gehen Sie zurück in die frühen 1980er Jahre. Friedman et al. @ Indiana haben das Konzept der "Motoren" im Kontext von Schema 84 (nicht Schema 48) erfunden. Ein Motor ist ungefähr ein Element dieses Typs:

E = Unit x Nats -> E + O

Sie können auch I anstelle von Unit verwenden und der Teil x Nats ist optional. Sie können sich diese als eine Form von Wiederaufnahmen vorstellen, und je nach Kontext sind Engines praktischer als Wiederaufnahmen.

Matthias
quelle
1
Vielen Dank! Google fand mich Haynes und Friedman, "Abstracting Timed Preemption with Engines" ( cs.indiana.edu/pub/techreports/TR178.pdf ), und Dybvig und Hiebs "Engines from Continuations" ( citeseerx.ist.psu.edu/viewdoc/) Zusammenfassung? doi = 10.1.1.64.6124 ) Gibt es noch andere Refs, die ich verpasst habe?
Neel Krishnaswami