如何在Reason ML中声明地图类型?

时间:2018-02-16 16:12:33

标签: dictionary ocaml reason reasonml

Reason ML优于JavaScript的一个优点是它提供了Map类型,它使用结构相等而不是引用相等。

但是,我找不到这个用法的例子。

例如,我如何声明一个类型scores,它是整数字符串的映射?

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

我将如何构建一个实例?

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

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

2 个答案:

答案 0 :(得分:18)

标准库Map在编程语言世界中实际上是非常独特的,因为它是一个模块函子,您必须使用它来为您的特定键类型(和the API reference documentation is therefore found under 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);

您可以使用其他数据结构来构建类似地图的功能,尤其是在您需要特定字符串键的情况下。那里有a comparison of different methods in the BuckleScript Cookbook。除了Js.Dict之外的所有内容都可以在BuckleScript之外使用。 BuckleScript还附带a new Map data structure in its beta standard library,我还没有尝试过。

答案 1 :(得分:4)

如果您只是在处理Map<string, int>,那么Belt的Map.String就可以解决问题。

module MS = Belt.Map.String;

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

围绕Belt的人体工学设计减轻了一些痛苦,并且它们是引导的不变地图! Belt中也有Map.Int。对于其他键类型,您必须定义自己的比较器。回到与上面详述的两步过程@glennsl类似的东西。