Мемоизация в Haskell с использованием готовых структур данных

Я нашел этот ответ и эту страницу вики быть отличным введением в мемоизацию в 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 .

5
задан Community 23 May 2017 в 12:26
поделиться