我需要将一个函数应用于我的地图中的每个元素。此函数可能会导致新值或没有值的结果,因此我希望从我的地图中删除此键/值对。通俗地说,我的地图会随着时间的推移而缩小。
我喜欢Data.Map中alter
函数的声音,但它需要提供密钥。所以我的直觉说只需用keys
抓住键,然后用我的地图作为累加器烹饪foldl'
,并将键作为我的输入列表。
但这是一种有效的方法吗?在我的命令性思维中,我做了一个O(n)传球来抓住钥匙,然后我的折叠'将在O(nlogn)时间内运行(记录n以查找每个项目的n个项目)。首先,当只需要一个时,似乎这将是2次传递。我开始了解到实际上,Haskell的懒惰会使这两个操作串联起来(即获取下一个键值,然后用它调用alter)所以也许这不是那么糟糕。但我宁愿在O(n)而不是O(nlogn)中找到一种方法。显而易见的是必须查找"查找"当我需要触摸所有这些项目时,每个项目都是单独的,在我的情况下,顺序无关紧要。
或者,我想我可以将值复制到新地图中并留下我不想要的那些,但我想这会简单地使用更多的内存并击败我缩小的地图的整个目的。
所以我正在寻找一些有关如何有效调整地图的提示。
请注意,此地图已经是foldl'中的累加器。
换句话说,我想做Data.Map.map
但也能删除值。目前我正在制作地图和过滤器,我正试图加快速度。
答案 0 :(得分:10)
您可能需要mapMaybeWithKey
功能:
mapMaybeWithKey :: (k -> a -> Maybe b) -> Map k a -> Map k b
为O(n)。映射键/值并收集
Just
结果。
如果您不需要访问密钥,则只需mapMaybe
。