Я нашел этот ответ и эту страницу вики быть отличным введением в мемоизацию в Haskell. Однако они все еще оставляют меня с вопросом, на который я надеюсь получить ответ:
Мне кажется, что используемая техника требует, чтобы вы «открылись» (например, « но это совсем не изящно: если f :: a -> b
, то, вероятно, можно легко создать мемоизированную версию f ':: Map ab -> a -> (Map ab, b )
, где первый аргумент - это память мемоизации, а выходная пара содержит потенциально обновленную память и вычисленное значение. Эта передача состояния, конечно, не то, что я хочу (хотя я предполагаю, что это можно было бы обернуть в монаду, но это на несколько порядков уродливее, чем подход в 1 и 2 ).
Редактировать 2: Может быть, это поможет попытаться выразить мой нынешний (неправильный) образ мышления. В настоящее время я, кажется, постоянно втягиваю себя против своей воли в неразрешение
import qualified Data.Map as Map
memo :: (Ord a) => [a] -> (a -> b) -> (a -> b)
memo domain f = (Map.!) storage
where
storage = Map.fromList (zip domain (map f domain))
. Чем больше я смотрю на это, тем больше я понимаю, что неправильно понял что-то основное. Видите ли, мне кажется, что моя записка [Верно, False]
эквивалентен мемоизатору bool
из 1 .