La definizione di un combinatore Y in F # è
let rec y f x = f (y f) x
f si aspetta di avere come primo argomento una continuazione per i sottoproblemi ricorsivi. Usando y f come continuazione, vediamo che f sarà applicato alle chiamate successive come possiamo sviluppare
let y f x = f (y f) x = f (f (y f)) x = f (f (f (y f))) x etc...
Il problema è che, a priori, questo schema preclude l'utilizzo di qualsiasi ottimizzazione di chiamata di coda: infatti, potrebbe esserci qualche operazione in sospeso nelle f, nel qual caso non possiamo semplicemente mutare il frame di stack locale associato a f.
Quindi:
- da un lato, utilizzando il combinatore Y è necessaria una continuazione diversa diversa dalla funzione stessa.
- sull'altro per applicare il TCO, vorremmo non avere alcuna operazione in sospeso in f e solo chiamare f stessa.
Sai in quale modo quei due potrebbero essere riconciliati? Come una Y con un accumulatore o una Y con un trucco CPS? O un argomento che dimostra che non c'è modo di farlo?