¿Sistemas de IO basados ​​en reanudación?

8

Últimamente he estado jugando con los resúmenes , principalmente del clásico artículo de Abramsky Retracing Some Paths in Process Algebra . Son bastante hábiles (básicamente soluciones a la ecuación de dominio ), y recuerdan mucho a las redes de Kahn.R=I(O×R)

Por supuesto, esta observación no es original para mí: forman una categoría monoidal rastreada, y Abramsky y Jagadeesan utilizaron este hecho para dar semántica a la lógica lineal. En cualquier caso, tenga en cuenta que si alimenta una reanudación una entrada de tipo I , obtiene una salida de tipo O y una reanudación actualizada r ' , que es lo que le permite modelar el hecho de que un nodo de flujo de datos puede cambiar a medida que ve entradas Adelante.rIOr

Como resultado, parece que podrían dar una buena API para construir transductores de E / S en un lenguaje de orden superior como ML o Haskell, pero parece que no puedo encontrar ningún documento que describa tal cosa. Pero han existido durante décadas, y Gordon Plotkin los inventó, por lo que no es que hayan languidecido en la oscuridad. Entonces me preguntaba si alguien los había visto ponerlos a tal uso.

Neel Krishnaswami
fuente
2
Mientras leía la pregunta pensé: "Apuesto a que Neel responderá a esta".
Andrej Bauer
Este podría ser un buen caso de uso para las operaciones y manejadores de estilo Eff.
Andrej Bauer
@AndrejBauer: Siempre pienso eso para las preguntas de Neel.
Dave Clarke

Respuestas:

7

Esto se parece mucho a la API de E / S descrita por Felleisen et al en A Functional I / O System (o Fun for Freshman Kids) . Básicamente, usted escribe (en la configuración más simple, no distribuida), una serie de controladores de eventos, cada uno de los cuales acepta el estado actual y devuelve un estado actualizado. Finalmente, hay un to-drawcontrolador que produce la "salida" para cada estado.

Si relanzamos esta API ligeramente, podemos empaquetar los controladores y el estado actual juntos, y cada vez que un controlador devuelve un nuevo estado y un nuevo conjunto de controladores. Podríamos llamar a este paquete de estado y operaciones un "objeto". :) Si luego hacemos que el resultado sea un par de este objeto, y la "salida", entonces tenemos exactamente el tipo de reanudación.

Curiosamente, en el documento, Felleisen et al hacen exactamente esto cuando se mueven a la configuración distribuida: cada operación devuelve un par de estado nuevo y "salida" en forma de mensajes para enviar a los otros participantes en el sistema.

Sam Tobin-Hochstadt
fuente
5

Acabo de encontrar esta publicación.

Volvamos a principios de la década de 1980. Friedman et al @ Indiana inventaron el concepto de 'motores' en el contexto del Esquema 84 (no del Esquema 48). Un motor es más o menos un elemento de este tipo:

E = Unit x Nats -> E + O

También puede usar I en lugar de Unit y la parte x Nats es opcional. Puede pensar en esto como una forma de reanudación y, dependiendo del contexto, los motores son más prácticos que las reanudaciones.

Matías
fuente
1
¡Gracias! Google me encontró a Haynes y Friedman, "Abstracting Timed Preemption with Engines" ( cs.indiana.edu/pub/techreports/TR178.pdf ), y "Engines from Continuations" de Dybvig y Hieb ( citeseerx.ist.psu.edu/viewdoc/ summary? doi = 10.1.1.64.6124 ) ¿Hay alguna otra referencia que me haya perdido?
Neel Krishnaswami