Я всегда думал, что Haskell сделает какое-то автоматическое интеллектуальное воспоминание. Например, наивная реализация Фибоначчи
fib 0 = 0
fib 1 = 1
fib n = fib (n-2) + fib (n-1)
Из-за этого будет быстрым. Теперь я прочитал этот, и кажется, что я ошибся - Haskell, похоже, не делает автоматическую memoization. Или я понимаю что-то не так?
Существуют ли другие языки, которые выполняют автоматическую (т.е. неявную, а не явную) memoization?
Каковы распространенные способы реализации memoization? Во всех примерах реализации, которые я видел, они используют хэш-карту, но нет никаких ограничений по ее размеру. Очевидно, это не сработало бы на практике, потому что вам нужен какой-то предел. И учитывая это, он становится более сложным, потому что, когда вы достигаете предела, вам нужно выбросить некоторые данные. И там это усложняется: если предел может быть динамическим и часто используемым, функции должны иметь более высокий предел, чем менее часто используемые функции? И какую запись вы выбрасываете, когда попадаете в лимит? Просто последний из них? В этом случае вам также нужно будет отсортировать ваши данные. Вы можете использовать некоторую комбинацию связанного списка и карту хэша для достижения этого. Это общий путь?
Не могли бы вы ссылаться (или ссылаться) на некоторые общие реалии реального мира?
Спасибо, Альберт
Изменить: меня больше всего интересует эта проблема, которую я описал, т.е. как реализовать такой предел. Любые ссылки на любые документы, которые касаются этого, были бы очень приятными.
Изменить: некоторые собственные мысли с примерной реализацией (с лимитом) можно найти здесь.
Изменить: я не пытаюсь решить конкретную проблему в конкретном приложении. Я ищу общие решения для memoization, которые могут быть применены глобально ко всем функциям (чисто функциональной) программы (поэтому алгоритмы, которые не реализуют ограничение памяти, не являются решением). Конечно, там (возможно) нет оптимального/лучшего решения. Но это делает мой вопрос не менее интересным.
Чтобы попробовать такое решение, я подумал о том, чтобы добавить его в Haskell в качестве оптимизации. Мне действительно интересно, насколько хорошо это будет.
И интересно, кто-то уже это сделал.