sé que si tuviera que calcular una lista de casillas en Haskell, que podría hacer esto:Haskell evaluación perezosa y Reciclar
squares = [ x ** 2 | x <- [1 ..] ]
Luego, cuando me llaman plazas de esta manera:
print $ take 4 squares
Y se imprimiría [1.0, 4.0, 9.0, 16.0]. Esto se evalúa como [1 ** 2, 2 ** 2, 3 ** 2, 4 ** 2]. Ahora que Haskell es funcional y el resultado sería el mismo cada vez, si volviera a llamar a las casillas en otro lugar, ¿volvería a evaluar las respuestas que ya ha calculado? Si tuviera que volver a usar cuadrados después de haber llamado a la línea anterior, ¿volvería a calcular los primeros 4 valores?
print $ take 5 squares
¿Sería evaluar [1,0, 4,0, 9,0, 16,0, 5 ** 2]?
1 para la explicación clara –
¿Hay alguna posibilidad de que puedas darme un ejemplo de algo que no sería memorable? Pensé que los cuadrados eran una función que devolvía una lista infinita. ¿Hay algo que pueda pasar a ghc para ver lo que Haskell está haciendo bajo las sábanas? –
No, los cuadrados son * no * una función; es una lista Las estructuras de datos se memorizan automáticamente en Haskell, no en las funciones. Aún puede memorizar funciones, pero tiene que hacerlo explícitamente. Si está confundido acerca de que los cuadrados no son una función, es posible que le guste la publicación del blog [* "Todo es una función" en Haskell? *] (Http://conal.net/blog/posts/everything-is-a- function-in-haskell /). – Conal