Определение Y комбинатора в F #
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 с трюком аккумулятора или Y с трюком CPS? Или аргумент, доказывающий, что это невозможно сделать?
f
. Мы можем видеть, что это y
может привести к ответному звонку f
с громоотводом (y f)
, но, как вы говорите, f
может иметь некоторую незавершенную операцию. Я думаю, что было бы интересно узнать, есть ли отдельный комбинатор, который более дружествен к разговору. Интересно, получит ли этот вопрос больше внимания на сайте CS Stackexchange?