Это в значительной степени следует http://www.haskell.org/haskellwiki/Memoization.
Требуется функция типа (a -> b). Если это не называет себя, то
Вы можете просто написать простую оболочку, которая кэширует возвращаемые значения.
Лучший способ сохранить это отображение зависит от того, какие свойства вы можете
эксплуатируют. Заказ в значительной степени минимум. С целыми числами
Вы можете создать бесконечный ленивый список или дерево, содержащее значения.
type Cacher a b = (a -> b) -> a -> b
positive_list_cacher :: Cacher Int b
positive_list_cacher f n = (map f [0..]) !! n
или
integer_list_cacher :: Cacher Int b
integer_list_cacher f n = (map f (interleave [0..] [-1, -2, ..]) !!
index n where
index n | n < 0 = 2*abs(n) - 1
index n | n >= 0 = 2 * n
Итак, предположим, что это рекурсивно. Тогда тебе это нужно называть не себе, а
запомненная версия, так что вы передаете это вместо:
f_with_memo :: (a -> b) -> a -> b
f_with_memo memoed base = base_answer
f_with_memo memoed arg = calc (memoed (simpler arg))
Записанная версия - это, конечно, то, что мы пытаемся определить.
Но мы можем начать с создания функции, которая кэширует свои входные данные:
Мы могли бы построить один уровень, передав функцию, которая создает
структура, которая кэширует значения. За исключением того, что нам нужно создать версию F
что уже имеет переданную кешированную функцию.
Благодаря лени это не проблема:
memoize cacher f = cached where
cached = cacher (f cached)
тогда все, что нам нужно, это использовать:
exposed_f = memoize cacher_for_f f
В статье даются советы о том, как использовать класс типов, выбирая в
вход в функцию, чтобы сделать выше, а не выбор явного
функция кеширования. Это может быть действительно хорошо - а не явно
построив кеш для каждой комбинации типов ввода, мы можем неявно
объединить кэши для типов a и b в кэш для функции, принимающей a и b.
Последнее замечание: использование этой ленивой техники означает, что кэш никогда не сжимается,
оно только растет. Если вы вместо этого используете монаду IO, вы можете управлять этим, но
мудрое выполнение этого зависит от моделей использования.