В чистом функциональном языке с ленивой семантикой (такой как Haskell) результаты вычислений запоминаются так, что дальнейшие вычисления функции с теми же входными данными не пересчитывают значение, а получают его непосредственно из кэша запомненных значений.
Мне интересно, будут ли эти запомненные значения повторно использованы в какой-то момент времени?
- Если это так, это означает, что запомненные значения должны быть пересчитаны позднее, и преимущества запоминания не так уж важны для ИМХО.
- Если нет, тогда ладно, это разумно для кэширования всего ... но означает ли это, что программа - если она выполняется в течение достаточно длительного периода времени - будет
всегда потреблять больше и больше памяти?
Представьте себе программу, выполняющую интенсивный численный анализ: например, для поиска корней списка из сотен тысяч математических функций с использованием алгоритма дихотомии.
Каждый раз, когда программа оценивает математическую функцию с конкретным действительным числом, результат запоминается. Но есть только очень малая вероятность
что точно такой же реальный номер снова появится во время алгоритма, что приведет к утечке памяти (или, по крайней мере, очень плохому использованию).
Моя идея заключается в том, что, возможно, запомненные значения просто «ограничиваются» чем-то в программе (например, текущим продолжением, стеком вызовов и т. Д.), Но я не смог найти что-то практическое по этому вопросу.
Признаюсь, я не слишком подробно изучал реализацию компилятора Haskell (ленивый?), Но, пожалуйста, кто-нибудь может объяснить мне, как это работает на практике?
РЕДАКТИРОВАТЬ: Хорошо, я понимаю свою ошибку из первых нескольких ответов: Чистая семантика подразумевает ссылочную прозрачность, которая, в свою очередь, не подразумевает автоматическую мемоизацию, а просто гарантирует, что с ней не будет проблем.
Я думаю, что некоторые статьи в Интернете вводят в заблуждение по этому поводу, потому что с точки зрения начинающего кажется, что свойство ссылочной прозрачности настолько круто, потому что оно позволяет неявное запоминание.