Похоже, что Haskell не выполняет автоматическое запоминание.Или я что-то не так понимаю?
Нет, Хаскелл не понимает.Однако общие выражения рассчитываются только один раз.В примере, приведенном Полом Джонсоном, x
хранится в куче как thunk .И y
, и z
могут ссылаться на x
, поскольку x
находится в области видимости, и они ссылаются на одно и то же местоположение.Как только x
должен быть оценен, он будет оценен только один раз, и будет сохранен только результат оценки.Так что это на самом деле не запоминание, а результат реализации.
Существуют ли другие языки, которые выполняют автоматическое (то есть неявное, не явное) запоминание?
IВы видели, как декоратор @ memoized появился в некотором исходном коде Python.Конечно, вы можете полностью создать свой собственный декоратор / реализацию для него.В комплекте с LRU и другими политиками, которые вы хотите использовать.
Каковы распространенные способы реализации заметок?
Не существует реального common
способа реализации заметок.Для фиб-подобных шаблонов (только один аргумент, который является числом) запоминание, используемое в примере с фибом. Можно придумать общее решение (хеш-карты один), и оно будет работать, но оно также может быть неоптимальным для вашей конкретной задачи..
С запоминанием у вас есть побочные эффекты, поэтому вы, вероятно, хотите, чтобы кеш жил в монаде штата.Однако, как правило, вы хотите сохранить ваши алгоритмы как можно более чистыми, поэтому, если у них есть рекурсия, вы уже в некотором беспорядке.Это потому, что вы будете вызывать запомненную версию функции рекурсивно, но она должна запускаться в монаде состояния, поэтому теперь вся ваша функция должна выполняться в монаде состояния.Это также влияет на лень, но вы можете попробовать ленивую монаду состояния .
Имея это в виду: хорошо автоматическое запоминание очень трудно достичь.Но вы можете легко пройти долгий путь.Автоматическое запоминание функций, вероятно, включает в себя преобразование программы, где написание вещей в точке фиксации может иметь большое значение.
Редактировать: Меня больше всего интересует проблема, которую я описал, то есть, как реализовать такой предел.Любые ссылки на любые документы, которые касаются этого, были бы очень хорошими.
Когда у вас есть базовый механизм запоминания, вы можете настроить поиск и сохранить функции для вашего запоминающего стола для реализации LRU или некоторого другого механизмасохраняя потребление памяти небольшим.Может быть, вы можете получить идею для LRU из этого примера C ++ .