No es una muy buena explicación.
"flotaba" significa simplemente que, en:
\x -> let y = ... in z
si ...
no menciona x entonces puede ser flotaron de la lambda:
let y = ... in \x -> z
lo que significa que solo se computará una vez, , lo que podría ahorrar mucho tiempo si ...
es costoso. Sin embargo, GHC es conservador acerca de realizar optimizaciones como esta, ya que pueden presentar fugas de espacio. (Aunque es lo hace para la segunda definición si le da una firma de tipo, como señala Daniel Fischer en su respuesta.)
No se trata de optimización automática, sin embargo. El primer fragmento define fib'
fuera de lambda, mientras que el segundo lo define adentro (el lambda está implícito en fib x = ...
, que es equivalente a fib = \x -> ...
), que es lo que dice la cita.
Incluso eso no es realmente relevante; lo relevante es que en el primer fragmento, map fib' [0 ..]
ocurre fuera de la lambda, por lo que su resultado se comparte entre todas las aplicaciones de la lambda (en ese código, la "lambda" surge de la aplicación parcial de (!!)
). En este último, está dentro de la lambda, y es muy probable que se vuelva a calcular para cada aplicación de fib
.
El resultado final es que la implementación anterior almacena en caché los valores y, por lo tanto, es mucho más eficiente que la última. Tenga en cuenta que la eficacia del primer fragmento depende del hecho de que fib'
no se repite directamente, sino a través de fib
, y por lo tanto se beneficia de la memorización.
Está relacionado con la expansión eta; el último fragmento es una expansión eta de la primera. Pero la declaración que citó no explica qué está pasando en absoluto.
Tenga en cuenta que este es el comportamiento específico de la implementación, y no parte de la semántica de Haskell. Sin embargo, todas las implementaciones razonables se comportarán de esta manera.
Esta respuesta y la respuesta de Daniel Fischer ahora son mutuamente recursivas. – misterbee
@misterbee: afortunadamente, solo los programadores de Haskell los leerán, y somos flojos, ¿verdad? – leftaroundabout