La definición de un combinador Y en F # es
let rec y f x = f (y f) x
f espera tener como primer argumento alguna continuación para los subproblemas recursivos. Usando yf como continuación, vemos que f se aplicará a llamadas sucesivas a medida que podamos desarrollar
let y f x = f (y f) x = f (f (y f)) x = f (f (f (y f))) x etc...
El problema es que, a priori, este esquema impide el uso de cualquier optimización de llamada de cola: de hecho, podría haber alguna operación pendiente en las f, en cuyo caso no podemos simplemente mutar el marco de pila local asociado con f.
Entonces :
- por un lado, usar el combinador Y requiere una continuación explícitamente diferente de la función misma.
- Por otro lado, para aplicar el TCO, nos gustaría no tener ninguna operación pendiente en f y solo llamar a f.
¿Conoces alguna forma en que esos dos puedan reconciliarse? ¿Como una Y con truco de acumulador, o una Y con truco de CPS? ¿O un argumento que demuestre que no hay forma de hacerlo?
f
. Podemos ver que y
podría hacer f
una llamada final con un sonido (y f)
, pero como usted dice, f
podría tener alguna operación pendiente. Creo que sería interesante saber si hay un combinador separado que sea más amigable con la cola. Me pregunto si esta pregunta recibiría mejor atención en el sitio CS Stackexchange.