2
Y组合器和尾部调用优化
F#中Y组合器的定义是 let rec y f x = f (y f) x f希望将递归子问题的某些延续作为第一个论点。使用yf作为延续,我们可以看到f将应用于后续调用,因为我们可以开发 let y f x = f (y f) x = f (f (y f)) x = f (f (f (y f))) x etc... 问题是,先验的是,该方案无法使用任何尾部调用优化:的确,f中可能存在一些待处理的操作,在这种情况下,我们不能仅仅改变与f相关联的本地堆栈帧。 因此: 一方面,使用Y组合器需要一个与函数本身截然不同的延续。 在其他方面要应用TCO,我们希望f中没有待处理的操作,而仅调用f本身。 您知道这两者可以和解的任何方式吗?就像带累加器技巧的Y或CPS技巧的Y一样?还是有论据证明不可能做到这一点?