【问题标题】:OCAML module contains type variables that cannot be generalizedOCAML 模块包含无法泛化的类型变量
【发布时间】:2019-09-21 12:17:42
【问题描述】:

代码:

  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 编译器知道我打算将键和值都存储为整数?

尝试了几种不同的方法,但都没有奏效。

【问题讨论】:

标签: ocaml


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    Avltree.empty 更改为(Avltree.empty : (int, int) Avltree.t) 可能会起作用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多