我想使用一个行为类似于简单的对[(a,b)]
列表的类型作为字典,将a
类型的键映射到类型b
的值,同时保持“用户指定的”,定义的键顺序。 (就像普通列表一样 - 我希望能够“追加”一个项目,然后将其识别为“最后一个元素”。)但是我希望在键上进行随机访问查找,而不是线性性能,即{ {1}}提供。除了定义其顺序的键列表之外,还有一种选择是维护普通地图:
Data.Map
然后定义data OrderedDict a b = OrderedDict (Map a b) [a]
操作等,以保持两个密钥集合同步。虽然维护两个相同密钥的独立集合似乎很难看。是否有现成的数据类型已经将有序键与按键有效的随机访问查找相结合?
答案 0 :(得分:4)
查看ixset
库 - 它允许您维护多列索引的集合(在您的情况下由a
和Int
)。这比手动保持地图一致更加可维护
答案 1 :(得分:3)
除非我完全误解了你的问题,否则Data.Map正是这样做的,使用密钥类型的Ord
实例进行排序。由于它是一个二叉树,因此实现也会保持按键的顺序。
Data.Map.keys
按升序为您提供地图的按键;因为Map的转换(例如map
)纯属函数,遍历的顺序是无关紧要的,并且从Map中获取一系列键或键/值对的所有方法都会为您提供一个有序列表。
答案 2 :(得分:3)
如果您只想保留一些固定的顺序(例如插入时间)以及O(log n)查找/插入,您可以简单地使用多个地图并同时更新它们:
Map a b
用于存储实际数据,Map Int a
为您提供订单中的第i个密钥。 (如果您还需要查询给定键的索引,则可以添加Map a Int
)