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一样?还是有论据证明不可能做到这一点?
f
。我们可以看到它y
可能会因重击f
而尾随(y f)
,但是正如您所说的,f
可能还有一些待处理的操作。我想知道是否有一个单独的组合器对尾调用更友好是很有意思的。我想知道这个问题是否会在CS Stackexchange网站上得到更好的关注?