web-dev-qa-db-ja.com

Reason MLでマップタイプを宣言するにはどうすればよいですか?

JavaScriptに対するReasonMLの利点の1つは、参照の同等性ではなく構造的な同等性を使用するMap型を提供することです。

しかし、その使用例は見つかりません。

たとえば、文字列から整数へのマップである型scoresをどのように宣言しますか?

/* Something like this */
type scores = Map<string, int>; 

そして、どのようにインスタンスを構築しますか?

/* Something like this */
let myMap = scores();

let myMap2 = myMap.set('x', 100);
12
sdgfsdh

標準ライブラリMapは、特定のキータイプのマップモジュールを構築するために使用する必要があるモジュールファンクターであるという点で、プログラミング言語の世界では実際には非常にユニークです(および APIリファレンスドキュメントはしたがって、Map.Make )の下にあります:

module StringMap = Map.Make({
  type t = string;
  let compare = compare
});

type scores = StringMap.t(int);

let myMap = StringMap.empty;
let myMap2 = StringMap.add("x", 100, myMap);

特に文字列キーが必要な場合は、マップのような機能を構築するために使用できる他のデータ構造があります。 BuckleScriptクックブックのさまざまなメソッドの比較 があります。 Js.Dictを除くすべては、BuckleScriptの外部で利用できます。 BuckleScriptには ベータ標準ライブラリの新しいMapデータ構造 も付属していますが、これはまだ試していません。

19
glennsl

Map<string, int>だけを扱っている場合は、BeltのMap.Stringでうまくいきます。

module MS = Belt.Map.String;

let foo: MS.t(int) = [|("a", 1), ("b", 2), ("c", 3)|]->MS.fromArray;

ベルトバージョンの人間工学は少し痛みが少なく、起動するための不変のマップです!ベルト内にはMap.Intもあります。他のキータイプについては、独自のコンパレータを定義する必要があります。これは、上記の2ステッププロセス@glennslに似たものに戻ります。

6
wegry