替换Data.Map中的键

Dan*_*iel 2 dictionary haskell key

如果我有两个键k0和k1,它们在Data.Map M中,如何从地图中删除k0并用k0替换k1?

完成此任务的最佳方法是什么?我试图浏览Data.Map的文档,但我只能找到可以更改值的函数.

chi*_*chi 6

据我所知,没有单一的库函数可以有效地为您执行此操作.但是,你可以自己做这样的事情:

case M.lookup k0 myMap of
   Nothing -> myMap
   Just e  -> M.insert k1 e (M.delete k0 myMap)
Run Code Online (Sandbox Code Playgroud)

这将需要三个映射操作,每个操作花费O(log N).

我们可以通过以下两种操作来完成:

case updateLookupWithKey (\_ _ -> Nothing) k0 myMap of
   (Nothing, _    ) -> myMap
   (Just e, newMap) -> M.insert k1 e newMap
Run Code Online (Sandbox Code Playgroud)

我不认为这可以进一步改进,因为在处理两个不同的键时我们无论如何都需要访问底层平衡搜索树的两倍.