【发布时间】:2011-07-27 16:50:05
【问题描述】:
我发现 this answer 和 this wiki page 是 Haskell 中记忆化的绝佳介绍。然而,他们仍然给我留下了一个我希望得到回答的问题:
在我看来,使用的技术要求您“打开”(如“访问内部”)用于存储记忆的数据结构。例如,1 实现了一个表结构,2 实现了section 3 中的一个树。是否可以使用预制的数据结构做类似的事情?例如,假设您认为Data.Map 真的很棒,并且希望将您的记忆值存储在这样的Map 中。一种方法可以使用像这样的预制数据结构进行记忆,其中 不 实现结构本身,而是使用预制的结构?
希望有人能给我一个关于如何思考的提示,或者更有可能纠正我对功能性记忆的一般误解。
编辑:我可以想到一种方法,但一点也不优雅:如果f :: a -> b,那么人们可能很容易制作一个记忆版本f' :: Map a b -> a -> (Map a b, b),其中第一个参数是记忆存储,输出对包含可能更新的存储和计算值。这种状态传递当然不是我想要的(虽然我猜它可以被包裹在一个 monad 中,但它比 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))
我越看这个,我就越意识到我误解了一些基本的东西。你看,我觉得我的memo [True, False] 相当于1 的bool memoizer。
【问题讨论】:
-
呃。阅读丹的回答,我确信“编辑 2”中的代码实际上没有任何问题。事实证明我只是错误地分析。它工作正常:-)
标签: haskell memoization