OCAML模块包含无法归纳的类型变量

时间:2019-05-02 23:40:40

标签: ocaml

代码:

  let size = 10
  let getTbl = Array.init size ~f:(fun _ -> Avltree.empty )
end 

错误:

Error: The type of this module,
       sig val size : int val getTbl : ('_weak1, '_weak2) Avltree.t array end,
       contains type variables that cannot be generalized

如何让Ocaml编译器知道我计划将键和值都存储为整数?

尝试了几种不同的方法-没有一种有效。

2 个答案:

答案 0 :(得分:2)

弱类型变量表示尚未推断出的类型,通常是因为您已经定义了程序变量并且从未使用过它,因此类型检查器不知道此变量包含什么内容。通常,这很好,因为变量的首次使用将定义其类型。但是,由于OCaml中的整个类型检查例程受编译单元(即文件)的范围限制,因此应在编译文件之前定义此类变量。

因此,您必须(1)使用变量,(2)将其约束为某种类型,例如,实现(.ml)文件中的(let getTbl : (int, int) Avltree.t array) ..,或{{1 }}文件。您甚至可以只创建一个空的mli文件(与.ml文件同名),这将自动隐藏模块中定义的所有变量并启用编译功能。

答案 1 :(得分:1)

Avltree.empty更改为(Avltree.empty : (int, int) Avltree.t)