1

这个问题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;and Js.log(Scores.n);),那么它就可以工作。

我在这里想念什么?

4

1 回答 1

2

scores是一个类型,并且类型,甚至记录类型,在类型本身上没有字段。此外,类型和值存在于不同的命名空间中,因此当scores 类型存在时,scores 不存在,因此出现错误“在分数中找不到值分数”。

另一方面,模块可以具有“字段”,这就是它存在于其中的原因。当然,您也可以使用与类型别名empty相同的方式进行别名Scores.t

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

最后,您问“确定要使 Map 实例的键类型必须已知吗?”。确实如此,而且你已经让人们知道了。您在制作StringMap模块时指定了密钥类型 ( Map.Make({ type t = string; ...0);)。但是,您不需要指定值类型 ( int)。这将被推断。

于 2018-02-26T16:57:48.843 回答