Definisi kombinator Y dalam F # adalah
let rec y f x = f (y f) x
f berharap sebagai argumen pertama beberapa kelanjutan untuk subproblem rekursif. Menggunakan yf sebagai kelanjutan, kita melihat bahwa f akan diterapkan pada panggilan yang berurutan yang dapat kita kembangkan
let y f x = f (y f) x = f (f (y f)) x = f (f (f (y f))) x etc...
Masalahnya adalah, apriori, skema ini menghalangi penggunaan optimasi panggilan ekor: memang, mungkin ada beberapa operasi yang tertunda di f, dalam hal ini kita tidak bisa hanya memutasi frame stack lokal yang terkait dengan f.
Jadi:
- di satu sisi, menggunakan kombinator Y membutuhkan kelanjutan yang berbeda secara eksplisit dari fungsi itu sendiri.
- pada saat yang lain untuk menerapkan TCO, kami ingin tidak ada operasi yang tertunda di f dan hanya memanggil f itu sendiri.
Apakah Anda tahu cara apa pun yang bisa dilakukan keduanya? Seperti Y dengan trik akumulator, atau Y dengan trik CPS? Atau argumen yang membuktikan bahwa tidak mungkin dilakukan?
f
. Kita dapat melihat bahwa y
dapat mengeklik f
dengan pukulan (y f)
, tetapi seperti yang Anda katakan f
mungkin memiliki beberapa operasi yang tertunda. Saya pikir itu akan menarik untuk mengetahui apakah ada kombinator terpisah yang lebih ramah tailcall. Saya ingin tahu apakah pertanyaan ini akan mendapatkan perhatian yang lebih baik di situs CS Stackexchange?