我正在寻找一个无 monad、常量访问查询O(1)关联数组。
考虑假设类型:
data HT k v = ???
我想构建一个不可变的结构一次:
fromList :: Foldable t, Hashable k => t (k,v) -> HT k v
我想随后以恒定时间访问重复查询它::
lookup :: Hashable k => HT k v -> k -> Maybe v
似乎有两个候选库不足:
unordered-containers
unordered-containers
包含 type 的严格和惰性变体HashMap
。两个HashMap
s 都有函数记录的O(log n)查询lookup
。这个查询访问时间似乎是由于HashMap
类型的构造,它们具有允许O(log n) insert
功能的内部树结构。对于许多用例来说,一个可以理解的设计权衡,但由于我不需要可变的HashMap
这种权衡阻碍了我的用例。
hashtables
hashtables
包含一个HashTable
类型类和三个具有不同表构造策略的实例类型。这个库的类型类定义了一个常数时间O(1) lookup
函数定义,但它永远嵌入在ST
monad 中。没有办法“冻结”有状态的HashTable
实现并拥有一个lookup
没有嵌入有状态单子的函数。当整个计算包装在一个状态单子中时,库的类型类接口设计得很好,但这种设计不适合我的用例。
是否存在其他一些定义类型和函数的库,这些库可以构造不可变的常量访问查询O(1)关联数组,该数组未嵌入有状态的单子中?
是否存在某种方法来包装或修改这些现有的基于散列的库以生成不嵌入在有状态单子中的不可变常量访问查询O(1)关联数组?