Визначення комбінатора 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?