Подтвердить что ты не робот

Хороший способ избежать "совместного использования"?

Предположим, что кто-то переведет этот простой код 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?

4b9b3361

Ответ 1

В этом случае ваш список pidigits является константой (или "постоянной аппликативной формой ), и GHC, вероятно, будет всплывать, вычислять его один раз и делиться между видами использования. Если ссылок на CAF нет, это будет сбор мусора.

Теперь, в общем случае, если вы хотите, чтобы что-то было пересчитано, включите его в функцию (например, добавив параметр фиктивного ()). Примеры в связанном вопросе о CAFs: Как сделать CAF не CAF в Haskell?