我发现这个答案和这个 wiki 页面是 Haskell 中记忆化的极好介绍。然而,他们确实给我留下了一个我希望得到回答的问题:
在我看来,所使用的技术要求您“打开”(如“访问内部”)用于存储记忆的数据结构。例如,1实现了一个表结构,2实现了第 3 节中的树。是否可以使用预制的数据结构做类似的事情?例如,假设您认为这Data.Map
真的很棒,并且想将您的记忆值存储在这样的Map
. 一种方法可以使用这样的预制数据结构进行记忆,其中一个人不实现结构本身,而是使用预制的结构?
希望有人能给我一个关于如何思考的提示,或者更有可能纠正我对功能性记忆的误解。
编辑:我可以想到一种方法,但它一点也不优雅:如果f :: a -> b
,那么一个人可能很容易制作一个 memoized version f' :: Map a b -> a -> (Map a b, b)
,其中第一个参数是 memoization 存储,输出对包含一个可能更新的存储和计算的值。这种状态传递当然不是我想要的(虽然我猜它可以被包裹在一个 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))
我越看这个,我就越意识到我误解了一些基本的东西。你看,我觉得 mymemo [True, False]
相当于1bool
的memoizer 。