この回答とこのwikiページは、Haskellでのメモ化の優れた紹介であることがわかりました。しかし、彼らは私に答えを期待している質問を残しています。
使用されている手法では、メモ化を保存するために使用するデータ構造を「開く」(「内部にアクセスする」など) 必要があるように思えます。たとえば、セクション 3で1はテーブル構造を実装し、 2はツリーを実装します。事前に作成されたデータ構造で同様のことを行うことは可能ですか? たとえば、これは本当に素晴らしいと思い、メモ化された値をそのような .xml ファイルに保存したいとします。構造自体を実装せずに、事前に作成されたものを使用する、このような事前に作成されたデータ構造を使用してメモ化にアプローチできますか?Data.Map
Map
うまくいけば、誰かが私に考え方のヒントを与えてくれるか、またはおそらく、機能的なメモ化全般に関する私の誤解を正してくれるでしょう。
編集:私はそれを行う1つの方法を考えることができますが、それはまったくエレガントではありません:もしf :: a -> b
、f' :: Map a b -> a -> (Map a b, 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))
これを見れば見るほど、基本的なことを誤解していることに気づきます。ほら、 my はmemoizer の1memo [True, False]
と同等だと私には思えます。bool