F #에서 Y 결합기의 정의는 다음과 같습니다.
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 또는 CPS 트릭이있는 Y처럼? 아니면 할 수있는 방법이 없다는 것을 증명하는 주장?
f
. 우리는 thunk로 y
tailcall 할 수 있지만 보류중인 작업이있을 수 있습니다. 테일 콜 친화적 인 별도의 콤비 네이터가 있는지 아는 것이 흥미로울 것 같습니다. 이 질문이 CS Stackexchange 사이트에서 더 나은 관심을 끌지 궁금합니다. f
(y f)
f