Хороший способ избежать "обмена"? - PullRequest
19 голосов
/ 07 июля 2011

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

21 голосов
/ 07 июля 2011

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

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

...