¿Qué es una función de punto fijo y cuándo son útiles?

Los combinadores de punto fijo son útiles cuando intentamos introducir la recursividad en el cálculo lambda. Considere la definición de factorial (usaré la notación similar a Haskell):

fac n = si n == 1 entonces 1 más n * fac (n-1)

En el cálculo lambda no tenemos ‘argumentos’ o coincidencia de patrones, por lo que debemos escribirlo así:

fac = \ n -> si n == 1 entonces 1 más n * fac (n-1)

Es una definición casi correcta de factorial. Desafortunadamente, es recursivo y el cálculo lambda no tiene recursividad, ya que no tiene ‘funciones con nombre’ en absoluto. Hagamos un truco: extraeremos la definición de ‘fac’ a una función separada ‘g’, que tomará ‘fac’ como parámetro y no será recursiva:

fac n = g fac n
g fac = \ n -> si n == 1 entonces 1 más n * fac (n-1)
– o
fac = g fac
g = \ fac, n -> si n == 1 entonces 1 más n * fac (n-1)

Genial, ahora tenemos una definición no recursiva para ‘g’ y una ecuación simple para ‘fac’: debe ser un punto fijo de ‘g’. Como tenemos combinadores de punto fijo (p. Ej., Combinador Y), también podemos escribir ‘fac’ de forma no recursiva:

fac = Y g