为什么我的地图类型没有被 Reason 导出?

Why is my Map type not exported by Reason?

之后,我创建了一个定义具体 Map 类型的文件(以及模块):

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

type scores = StringMap.t(int);

现在,我想在另一个文件中使用该类型:

/* Demo.re */
let currentScores = Scores.scores.empty;

Js.log(currentScores);

但是,这给了我错误:

The value scores can't be found in Scores

如果我添加一个常量(例如 let n = 123;Js.log(Scores.n);),那么它就可以工作。

我在这里错过了什么?

scores 是一种类型,类型,甚至是记录类型,在类型本身上没有字段。此外,类型和值存在于不同的命名空间中,因此虽然 scores type 存在,但 scores value 不存在,因此出现错误 "The value scores can't be found in Scores".

另一方面,模块可以有 "fields",所以这就是它存在的原因。当然,您也可以像为 Scores.t 类型设置别名一样为 empty 设置别名:

type scores = StringMap.t(int);
let empty = StringMap.empty;

最后,你问"Surely to make a Map instance the key-type must be known?"。确实如此,而且您已经将其广为人知。您在创建 StringMap 模块 (Map.Make({ type t = string; ...0);) 时指定了密钥类型。但是,您不需要指定值类型 (int)。这将被推断。