2017-06-11 8 views
1

私はunordered-containers-0.2.8.0:Data.HashMap.Base.HashMapを参照しているプロジェクトに取り組んでいます。隠しHashMap.Baseタイプを調べるにはどうしたらいいですか?

このタイプの値を含むモジュールは、インポートセクションのどこから来たのかを示しておらず、Data.HashMap.Baseをインポートできません。

しかし、:bro wsingは、少なくとも一部のケースで抽象型であることを示しています。それは、私はどちらかLazyまたはStrict変種から関数をインポートすることができ

> :bro Data.HashMap.Lazy 
[...] 
unordered-containers-0.2.8.0:Data.HashMap.Base.toList :: 
unordered-containers-0.2.8.0:Data.HashMap.Base.HashMap k v 
-> [(k, v)] 

を意味するのでしょうか?

答えて

4

はい、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.LazyData.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.StrictData.Map.Lazyプレーンマップについても同様です。 "厳密な"マップは同じオブジェクトであるため、 "厳密な"マップは遅延作業で使用でき、逆も同様です。 Data.Map.Lazyのドキュメントから引用:

このモジュールのAPIは、キーでは厳密ですが、値が怠けています。値厳密なマップが必要な場合は、代わりにData.Map.Strictを使用します。 Map型自体は遅延モジュールと厳密モジュール間で共有されます。つまり、同じMap値を両方のモジュールの関数に渡すことができます(めったに必要ありません)。

関連する問題