はい、unordered-containers
パッケージでは、Data.HashMap.Lazy
またはData.HashMap.Strict
のいずれかをインポートすることを意図しています。どちらの変種も厳密なキー(WHNFと評価されています)を持ち、値がWHNFに評価されるかどうかは異なります。
unordered-containers
のソースパッケージには、レイジーと厳密な両方のバリアントで共有されるコードを含む隠しモジュールData.HashMap.Base
があります。このモジュールは隠されているため(技術的には、exposed-modules
スタンザの代わりにother-modules
スタンザのパッケージのCabalファイルに記載されているため)、直接インポートすることは意図されていませんが、他の2つのモジュールの1つを介して間接的にのみインポートされます。特にtoList
については
露出モジュールData.HashMap.Lazy
とData.HashMap.Strict
両方の使用(すなわち、再輸出)あなたはGHCiのブラウジングでこれを見ている理由である非表示モジュールData.HashMap.Base
、で定義されたtoList
の同じ定義。
あなたはGHCiの中のモジュールのいずれかをインポートする場合は、あなたがtoList
とそのコンポーネントの種類を検査することができる必要があります:実際に
> import Data.HashMap.Strict
> :t toList
toList :: HashMap k v -> [(k, v)]
> :i HashMap
type role HashMap nominal representational
data HashMap k v
= unordered-containers-0.2.7.2:Data.HashMap.Base.Empty
...
、あなたは同じHashMap
定義が両方に使用されていることを発見するでしょう厳密で怠惰なバリアントなので、あなたは思っている意味で「抽象」ではありません。どちらの実装も同じ基本的な具体的なデータ構造を使い、そのデータ構造上で動作する関数がそれをどのように使用するかは異なります。
これは、Data.Map.Strict
とData.Map.Lazy
プレーンマップについても同様です。 "厳密な"マップは同じオブジェクトであるため、 "厳密な"マップは遅延作業で使用でき、逆も同様です。 Data.Map.Lazy
のドキュメントから引用:
このモジュールのAPIは、キーでは厳密ですが、値が怠けています。値厳密なマップが必要な場合は、代わりにData.Map.Strictを使用します。 Map型自体は遅延モジュールと厳密モジュール間で共有されます。つまり、同じMap値を両方のモジュールの関数に渡すことができます(めったに必要ありません)。