No pretendo entender esto en absoluto, pero si esto ayuda a alguien ... entonces yippee.
Considere la definición de fix. fix f = let x = f x in x. La parte alucinante es que xse define como f x. Pero piénselo por un minuto.
x = f x
Dado que x = fx, entonces podemos sustituir el valor de xen el lado derecho de eso, ¿verdad? Asi que, por lo tanto...
x = f . f $ x
x = f . f . f $ x
x = f . f . f . f . f . f . f . f . f . f . f $ x
Entonces, el truco es, para terminar, ftiene que generar algún tipo de estructura, de modo que un fpatrón posterior pueda coincidir con esa estructura y terminar la recursividad, sin preocuparse realmente por el "valor" completo de su parámetro (?)
A menos que, por supuesto, quieras hacer algo como crear una lista infinita, como lo ilustró luqui.
La explicación factorial de TomMD es buena. La firma de tipo de Fix es (a -> a) -> a. La firma de tipo de (\recurse d -> if d > 0 then d * (recurse (d-1)) else 1)es (b -> b) -> b -> b, en otras palabras, (b -> b) -> (b -> b). Entonces podemos decir eso a = (b -> b). De esa forma, la corrección toma nuestra función, que es a -> a, o realmente,(b -> b) -> (b -> b) y devolverá un resultado de tipo a, en otras palabras b -> b, en otras palabras, ¡otra función!
Espera, pensé que se suponía que devolvería un punto fijo ... no una función. Bueno, lo hace, algo así (ya que las funciones son datos). Puedes imaginar que nos dio la función definitiva para encontrar un factorial. Le dimos una función que no sabía cómo recurrir (por lo tanto, uno de los parámetros es una función que se usa para recurrir) y le fixenseñamos cómo recurrir.
¿Recuerdas cómo dije que ftiene que generar algún tipo de estructura para que un fpatrón posterior pueda coincidir y terminar? Bueno, eso no es exactamente correcto, supongo. TomMD ilustró cómo podemos expandirnos xpara aplicar la función y avanzar hacia el caso base. Para su función, usó un if / then, y eso es lo que provoca la terminación. Después de repetidos reemplazos, la inparte de la definición total de fixeventualmente deja de definirse en términos de xy es entonces cuando es computable y completa.
fix errorghci y sentirse bien consigo mismo".