モナドを使用しない定数アクセス クエリ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
不足している 2 つの候補ライブラリがあるようです。
unordered-containers
unordered-containers
タイプの厳密なバリアントと遅延バリアントの両方が含まれますHashMap
。関数によって文書化されているように、両方HashMap
の s にはO(log n)クエリがありlookup
ます。このクエリ アクセス時間は、 O(log n)機能HashMap
を可能にする内部ツリー構造を持つ型の構築によるものと思われます。多くのユースケースで理解できるデザインのトレードオフですが、変更可能なものは必要ないため、このトレードオフが私のユースケースを妨げています。 insert
HashMap
hashtables
hashtables
HashTable
タイプクラスと、さまざまなテーブル構築戦略を持つ 3 つのインスタンス タイプが含まれています。このライブラリの型クラスは一定時間のO(1) lookup
関数定義を定義しますが、それはST
モナドに永遠に埋め込まれています。HashTable
ステートフルな実装を「凍結」してlookup
、ステートフルなモナドに埋め込まれていない関数を持つ方法はありません。ライブラリの型クラス インターフェイスは、計算全体がステート モナドにラップされている場合は適切に設計されていますが、この設計は私のユース ケースには適していません。
ステートフル モナドに埋め込まれていない不変の定数アクセス クエリO(1)連想配列を構築できる型と関数を定義する他のライブラリは存在しますか?
これらの既存のハッシュ ベースのライブラリをラップまたは変更して、ステートフル モナドに埋め込まれていない不変の定数アクセス クエリO(1)連想配列を生成する方法はありますか?