haskell - tipado - ¿Una buena forma de evitar "compartir"?
tipado en haskell (1)
En este caso, su lista de pidigits es una constante (o "formulario de aplicación constante"), y es probable que GHC lo haga flotar, lo calcule una vez y lo comparta entre usos. Si no hay referencias a la CAF, será basura recolectada.
Ahora, en general, si desea que se recalcule algo, conviértalo en una función (por ejemplo, agregando un parámetro ficticio). Ejemplos en la pregunta vinculada sobre CAF: ¿Cómo hacer una CAF no una CAF en Haskell?
Supongamos que alguien traduzca este simple código de Python a Haskell:
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
Versión Haskell:
importantAstrologicalCalculation digits =
isInfixOf digits luckyNumbers
where
luckyNumbers = calculateFirstDigitsOfPi 1000000
Después de trabajar con la versión de Haskell, el programador se sorprende al descubrir que su versión de Haskell "filtra" la 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 una manera fácil y elegante de hacer que el programa "olvide" luckyNumbers
?