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
B ! { l o o k u p , u p d a t e } ⇒ ( A → B ! ∅ ) ! ∅
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.Δl o o k u pu p d a t e
B ! ( { l o o k u p , u p d a t e } ∪ Δ ) ⇒ ( A → B ! ∅ ) ! Δ
Δsi! ( { l o o k u p , u p d a t e } ∪ Δ ) ⇒ ( A → B ! Δ ) ! Δ
Δ