F # içindeki Y birleştiricisinin tanımı
let rec y f x = f (y f) x
f, ilk argüman olarak, özyinelemeli alt problemler için bir miktar devam etmeyi beklemektedir. Yf'yi bir devamı olarak kullanarak, geliştirebileceğimiz gibi f'nin birbirini izleyen çağrılara uygulanacağını görüyoruz.
let y f x = f (y f) x = f (f (y f)) x = f (f (f (y f))) x etc...
Sorun şu ki, a priori, bu şema herhangi bir kuyruk çağrısı optimizasyonu kullanmayı engeller: gerçekten de f'lerde bekleyen bir işlem olabilir, bu durumda f ile ilişkili yerel yığın çerçevesini değiştiremeyiz.
Yani :
- bir tarafta, Y birleştiricisini kullanmak işlevin kendisinden açıkça farklı bir devam gerektirir .
- TCO'yu uygulamak için, f'de bekleyen herhangi bir işlemimiz yok ve sadece f'nin kendisini çağırıyoruz.
Bu ikisinin uzlaştırılabileceği herhangi bir yol biliyor musunuz? Akümülatör numarasına sahip bir Y veya CPS numarasına sahip bir Y gibi mi? Yoksa yapılabilecek bir yol olmadığını kanıtlayan bir argüman mı?
f
. Bunun bir thunk ile y
kuyruk çağırabileceğini görebiliriz, ancak dediğin gibi bekleyen bir operasyon olabilir. Daha kuyruk dostu olan ayrı bir birleştirici olup olmadığını bilmek ilginç olurdu. Acaba bu sorunun CS Stackexchange sitesinde daha iyi dikkat çekecek mi? f
(y f)
f