14

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);
4

2 回答 2

21

标准库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 Cookbook 中有不同方法的比较。除Js.DictBuckleScript 之外的所有内容都可用。BuckleScript 还在其 beta 标准库中附带了一个新的 Map 数据结构,我还没有尝试过。

于 2018-02-16T17:50:56.987 回答
6

如果你只是处理一个Map<string, int>,Belt'sMap.String就可以了。

module MS = Belt.Map.String;

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

腰带版本周围的人体工程学设计不那么痛苦,而且它们是不可变的启动地图!Map.IntBelt内也有。对于其他键类型,您必须定义自己的比较器。这又回到了类似于上面详述的两步过程@glennsl 的东西。

于 2018-11-28T19:25:13.417 回答