3

OCaml では、ジェネリック マップにポリモーフィック関数がありますか? すなわち:

あなたが持つことができます:f : 'a list -> boolと同等のものとしてbool f<T> ([T] x)

次のようなものもありますか:f : ('k,'v) map -> boolに相当するものとしてbool f<K,V> (Map<K,V> x)?

Map.Makeもしそうなら、型シグネチャの正しい構文は何ですか?また、そのような関数をどのように実装しますか? )?

ありがとう

4

1 に答える 1

3

使用するジェネリック マップのタイプによって異なり、2 つのパラメーター (キーのタイプと値のタイプ) を区別する必要があります。デフォルト ライブラリのMap.Makeファンクターを使用する場合、値の型をジェネリックにすることができますが、キーの型は (ファンクターのインスタンス化によって) 固定されます: 特定のキー モジュールKeyに対して、によって生成されるマップはmodule MyMap = Map.Make(Key)、 1 つのパラメータ 、'v MyMap.tしたがって、 を持つことができますf : 'v MyMap.t -> bool

('k, 'v) pmapキー型と値型の両方で多態的であることを許可する形式の型を持つ、いわゆる「多態的」マップを提供する他のライブラリがあります。ただし、これには通常、静的保証が少なくなるという代償が伴い'kます。キーの順序を保持しない方法で変更すると、コンパイル時に検出できない方法で一貫性のない結果が得られます。

もちろん、Map.Makeファンクタ自体を拡張することで、任意のキー タイプで機能する追加の関数を実装できます (コードはテストされていません)。

module MyMake(K : Map.OrderedType) = struct
  include Map.Make(K)
  (* after the "include", all the functions provided by `Map.Make`
     are available in the module *)
  let is_not_empty m = not (is_empty m)
end

module MyMap = MyMake(String)
let foo = MyMap.is_not_empty (...)

(注意: 永続的なコレクション (値のコピー/共有/バックトラッキングなし) が必要なく、最悪の場合の複雑さ (ユーザーによるサービス拒否攻撃にさらされる使用なし) を気にしない場合は、また、型を提供するHashtblモジュールでハッシュテーブルを使用します('k, 'v) Hashtbl.t. しかし、多態性は実際に'kは存在しません: このパラメータを変更できる関数はありません)。

于 2013-01-31T16:06:17.383 に答える