คำจำกัดความของ Y combinator ใน 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...
ปัญหาคือโครงร่างนี้ precludes โดยใช้การปรับ tail call ใด ๆ : แน่นอนว่าอาจมีการดำเนินการบางอย่างที่ค้างอยู่ใน f's ซึ่งในกรณีนี้เราไม่สามารถกลายพันธุ์ local stack frame ที่เกี่ยวข้องกับ f
ดังนั้น:
- ในด้านหนึ่งการใช้ Y combinator ต้องมีความต่อเนื่องที่แตกต่างกันอย่างชัดเจนกว่าฟังก์ชั่นของตัวเอง
- บน othe เพื่อใช้ TCO เราต้องการให้ไม่มีการดำเนินการที่ค้างอยู่ใน f และเรียก f เท่านั้น
คุณรู้วิธีใดบ้างที่จะสามารถปรับความสมดุลทั้งสองได้ ชอบ Y ที่มีเคล็ดลับสะสมหรือ Y กับเคล็ดลับ CPS? หรือมีข้อโต้แย้งที่พิสูจน์ว่าไม่มีทางที่จะทำได้?
f
ฉันคิดว่ามันขึ้นอยู่กับ เราสามารถเห็นได้ว่าy
สามารถตัดf
กับอันธพาล(y f)
แต่อย่างที่คุณบอกว่าf
อาจมีการดำเนินการที่ค้างอยู่ ฉันคิดว่ามันน่าสนใจที่จะทราบว่ามี combinator แยกต่างหากที่เป็นมิตรกับหางมากขึ้น ฉันสงสัยว่าคำถามนี้จะได้รับความสนใจมากขึ้นในไซต์ CS Stackexchange หรือไม่