Pregunta sobre el subtipo de controladores en "Un sistema de efectos para efectos algebraicos y controladores"

8

Tenía una pregunta sobre el subtipo en el documento "Un sistema de efectos para efectos algebraicos y controladores" . Me preguntaba por qué no hay una regla de subtipo para agregar efectos en ambos lados de un tipo de controlador, algo como esto:

T!UNAR!siT!(UNAC)R!(siC)

Esto sería útil cuando aplique una variable con un tipo de controlador a un cálculo con más efectos que el tipo de controlador en su lado izquierdo.

Puede agregar efectos a ambos lados de un tipo de controlador utilizando la regla de escritura para controladores, pero eso no funcionará para las variables. Por ejemplo, cuando el controlador es un argumento para una función.

Labbekak
fuente

Respuestas:

9

Me sorprende que no recibamos esta pregunta con más frecuencia, ya que Andrej y yo hemos considerado agregar esta regla durante bastante tiempo y creemos que ha demostrado su corrección. Pero al final, resultó ser falso, al menos en una configuración de llamada por valor (he oído que funciona mejor en llamada por valor de inserción).

Considere el controlador de estado, que se describe en la parte superior de la página 24 del mismo papel, que tiene un cálculo de estado de tipo en el estado y la transforma en una función pura a partir de a . ¡Su tipo es Tenga en cuenta los dos conjuntos vacíos en el lado derecho. El primero indica que la función resultante es pura, el segundo que no se producen efectos al producir esta función.A A B B ! { l o o k u p , u p d a t e } ( A B ! ) ! siUNAUNAsi

si!{looktupags,tupagsreunatmi}(UNAsi!)!

Ahora suponga que aplicamos el controlador a un cálculo que puede llamar a otros efectos además de y . Aplicando la regla sugerida, obtendría el tipo pero, de hecho, el tipo correcto es como los efectos no controlados puede ocurrir antes de producir la función o después de llamarla.Δlooktupagstupagsreunatmi

si!({looktupags,tupagsreunatmi}Δ)(UNAsi!)!Δ
Δ
si!({looktupags,tupagsreunatmi}Δ)(UNAsi!Δ)!Δ
Δ
Matija Pretnar
fuente
1
Gracias Matija! ¿Cómo te libras de no tener esta regla? ¿Cómo podría aplicar el controlador de estado (cuando no está en línea) a un cálculo que tiene más efectos que solo buscar y actualizar? ¿Supongo que tendrías que alinear todos los controladores?
Labbekak
1
Puede escapar mediante let-polymorphism (que no está incluido en el documento que ha vinculado) y asignar el tipo al manejador. Vea nuestro último documento de ESOP sobre este tema. UNA,si,Δ.si!({looktupags,tupagsreunatmi}Δ)(UNAsi!Δ)!Δ
Matija Pretnar