Una introducción amable a los combinadores Y y Z sin let ni recursión

Fuentes: No Let, No Rec, No Problem: A Gentler Introduction to the Y and Z Combinators
Imagen generada por IA con el prompt: Abstract mathematical composition with floating lambda symbols, recursive function diagrams, and soft blue lighting, editorial tech illustration style
Imagen generada con IA

Este artículo propone un recorrido didáctico por los combinadores Y y Z a partir de un acertijo en JavaScript: implementar el factorial de un número sin usar bucles, recursión ni declaraciones como let, const o function. El texto utiliza esta restricción aparentemente artificial como motor pedagógico para introducir, de forma progresiva, conceptos del cálculo lambda y de la programación funcional que suelen percibirse como abstractos.

El autor parte de una implementación recursiva canónica del factorial para dejar claro qué comportamiento se quiere reproducir. A continuación, descarta una primera solución basada en recursión mutua entre dos funciones auxiliares (factf y factg) por considerar que también constituye recursión. Después presenta una función factgen(self, n) que recibe una referencia a sí misma como primer argumento. Aunque factgen no se llama a sí misma directamente, el patrón self(self, n) que aplica a ese argumento es el mecanismo central que debe aprovecharse para emular la recursión.

El artículo introduce entonces el combinador de autoaplicación rep = x => x(x) y muestra que, en sentido ecuacional, rep(rep) se reduce a sí mismo, es decir, produce autoaplicación sin bucles ni recursión explícita. Si dentro de rep se invoca una función h sobre su propio resultado, se obtiene que rep(rep) equivale a h(rep(rep)). A partir de esta observación, el autor define el combinador Y como una función de orden superior que recibe un generador de recursión h y devuelve ese código autoaplicativo parametrizado por h. Y(f) se reduce a f(Y(f)), por lo que el valor devuelto es el punto fijo de f, en línea con el concepto matemático de punto fijo.

Por último, el texto señala el problema práctico de la evaluación estricta en JavaScript: una definición ingenua de Y desborda la pila porque su argumento se evalúa de forma eager. La solución apuntada es el combinador Z, una variante estricta del Y que retrasa la autoaplicación hasta el momento adecuado mediante el control del momento de la evaluación. La pieza se sitúa en la intersección entre cálculo lambda, teoría de la computación y práctica de JavaScript, y está dirigida a programadoras y programadores que quieran entender cómo funciona la recursión desde sus fundamentos funcionales, más allá de la simple auto-invocación que ofrecen los lenguajes.