4

キーから値へのマップがある場合、キーのセットを固定ダミー値へのキーのマップとして実装できます。

ダミーの候補は多数あります。

  • data-コンストラクタなしで定義された型
  • 他の無人タイプ (例forall a . a)
  • シングルトン型
  • ボックス化されていないタイプ

私にとって最も明白な解決策は、ストックシングルトンタイプを使用することですが()、ボトムcaseと区別できるため、のメモリ表現には間接が含まれ()ていると思います。()

2 つの質問があります。

  • Map.fromList [(1, ()), (2, ())]より多くのメモリを消費しlet dummy = () in Map.fromList [(1, dummy), (2, dummy)]ますか?
  • メモリ フットプリント、CPU 使用率、および正確性を考慮して、 bytestring-triedummyからセットを構築するために推奨される値はどれですか?
4

2 に答える 2

11

Nullary コンストラクターは 1 回だけ割り当てられます。その後、それらの使用はすべて共有されます (GHC では、この動作は Haskell 標準では規定されていません)。

()ユニット型の nullary コンストラクタです()()そのため、あらゆる場所で使用してもメモリはほとんど消費されません。ただし、型パラメーターを にインスタンス化する場合()でも、そのパラメーターの存在に対して料金が発生します。そのため、たとえばSet a、 using の代わりに特殊化された がありMap a ()ます。

キーと値のデータ構造の場合、適切な値を持つ型が必要です。したがって、()は正しい選択ですが、空のデータ型はそうではありません。forall a. a追加で別のデータ型にラップする必要がある、または引数として使用する場合に非予測性を必要とするような多相型は、一般的に十分にサポートされていません。

于 2012-11-29T11:56:51.033 に答える
4

()キーはすべて、割り当てられた単一のコンストラクターを指すポインター (として表されます) になります。

于 2012-11-29T13:10:24.427 に答える