2011-07-07 22 views
18

Supongamos que alguien se traduciría este código Python sencilla a Haskell:¿Una buena manera de evitar "compartir"?

def important_astrological_calculation(digits): 
    # Get the first 1000000 digits of Pi! 
    lucky_numbers = calculate_first_digits_of_pi(1000000) 
    return digits in lucky_numbers 

Haskell versión:

importantAstrologicalCalculation digits = 
    isInfixOf digits luckyNumbers 
    where 
    luckyNumbers = calculateFirstDigitsOfPi 1000000 

Después de trabajar con la versión Haskell, el programador se sorprende al descubrir que su versión Haskell filtraciones" "memoria: después de la primera vez que se llama a su función, luckyNumbers nunca se libera. Eso es preocupante ya que el programa incluye algunas funciones más similares y la memoria consumida por todas ellas es significativa.

¿Hay alguna manera fácil y elegante de hacer que el programa "olvide" luckyNumbers?

+1

elegante, pero ¿qué ocurre si agrega '{- # NOINLINE importantAstrologicalCalculation # -}'? –

+4

Hubo una pregunta recientemente, preguntando aparentemente lo mismo, pero usando terminología más avanzada. Es posible que desee echarle un vistazo: http://stackoverflow.com/questions/6090932/how-to-make-a-caf-not-a-caf-in-haskell – Rotsor

Respuesta

19

En este caso, su lista de pidigits es una constante (o "formulario de aplicación constante ), y GHC probablemente lo flotará, lo calculará una vez y lo compartirá entre usos. Si no hay referencias a la CAF, será recolectado

Ahora, en general, si quieres que algo se volverá a calcular, convertirlo en una función (por ejemplo, mediante la adición de un () parámetro ficticio) Ejemplos en la cuestión vinculada a los CAF:.. How to make a CAF not a CAF in Haskell?

No
+0

+1 para el puntero a un similar pregunta. –

+0

¿Cambiarlo cambia algo? stackoverflow.com/questions/6208006 crea una situación similar sin que nada sea una constante. – yairchu

Cuestiones relacionadas