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