Хороший способ избежать "совместного использования"?
Предположим, что кто-то переведет этот простой код Python в 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
Версия Haskell:
importantAstrologicalCalculation digits =
isInfixOf digits luckyNumbers
where
luckyNumbers = calculateFirstDigitsOfPi 1000000
После работы с версией Haskell программист удивлен, обнаружив, что его версия Haskell "утечка" памяти - после того, как первая функция вызвана, luckyNumbers
никогда не освобождается. Это вызывает беспокойство, поскольку программа включает в себя некоторые более похожие функции, и память, потребляемая всеми из них, является значительной.
Есть ли простой и элегантный способ сделать программу "забыть" luckyNumbers
?
Ответы
Ответ 1
В этом случае ваш список pidigits является константой (или "постоянной аппликативной формой
), и GHC, вероятно, будет всплывать, вычислять его один раз и делиться между видами использования. Если ссылок на CAF нет, это будет сбор мусора.
Теперь, в общем случае, если вы хотите, чтобы что-то было пересчитано, включите его в функцию (например, добавив параметр фиктивного ()
). Примеры в связанном вопросе о CAFs: Как сделать CAF не CAF в Haskell?