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 x
se define como f x
. Pero piénselo por un minuto.
x = f x
Dado que x = fx, entonces podemos sustituir el valor de x
en 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, f
tiene que generar algún tipo de estructura, de modo que un f
patró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 fix
enseñamos cómo recurrir.
¿Recuerdas cómo dije que f
tiene que generar algún tipo de estructura para que un f
patrón posterior pueda coincidir y terminar? Bueno, eso no es exactamente correcto, supongo. TomMD ilustró cómo podemos expandirnos x
para 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 in
parte de la definición total de fix
eventualmente deja de definirse en términos de x
y es entonces cuando es computable y completa.
fix error
ghci y sentirse bien consigo mismo".