Ocaml: "contains type variables that cannot be generalized"

标签 ocaml typeerror

type ide = string;;
type exp = http://pastebin.com/EhD9QdYj;;
let emptyEnv = fun x -> raise EmptyEnvException;;
let emptyFunEnv = fun x -> raise EmptyEnvException;;
let raddoppia = Function("mul2", "x", Mul(Ide "x", Int 2));;
(**)let funenv0 = funDeclr raddoppia emptyEnv emptyFunEnv;;

此代码使用 ocamlc 编译,返回此错误:
File "progetto.ml", line (**), characters 14-53:
Error: The type of this expression, ide -> ide * exp * ('_a -> 'b),
contains type variables that cannot be generalized

问题是什么?

最佳答案

首先,您应该点击@didierc 提供的链接并阅读弱类型变量,以便您了解它们存在的原因以及它们何时发挥作用。

通常,弱类型变量没有什么不好的,尤其是在编写脚本时。您可以通过使用 eta-expansion 来加强它们(即,通过枚举部分应用函数的所有参数,例如,用 List.hd 替换 fun x -> List.hd x )。

弱变量不允许无处不在,特别是它们不能转义模块,即它们不能出现在模块签名中。因此,只能从定义它的模块内部访问具有弱类型的值。这在词法上保证了一个变量只有一种类型,一旦被访问就会被赋值。

当你写 ml文件,您创建了编译单元的一部分。编译单元由实现(ml 文件)和接口(interface)(mli 文件)组成。如果省略后者,编译器将自动推断接口(interface),导出模块的所有字段。在这种情况下,它也会导出弱变量。

综上所述,您可以创建一个空的 progetto.mli文件,这将关闭 Progetto模块,并且没有弱变量会泄漏它。这样编译器就会很高兴,因为没有人可以破坏类型系统。

关于Ocaml: "contains type variables that cannot be generalized",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32268203/

相关文章:

ocaml - 自动为递归数据结构生成差异 pp

ocaml - 我可以在 OCaml 中进行面向方面的编程吗?

haskell - 相互递归函数的 Hindley Milner 类型推理

python - 将不存在的路径分配给字符串时出现类型错误

python - 在 python PyNaCl 中从数据库中检索加密 key ,我如何转换回 PublicKey 或 PrivateKey 对象?

python - 类型错误: 'in <string>' 需要字符串作为左操作数,而不是列表(列表理解)

python - 类型错误:不支持的操作数类型 -: 'int' 和 'str'

python - 类型 str 没有定义 __round__ 方法错误

module - OCaml 模块类型和单独编译

c - 为什么这个 OCaml 程序比我的 C 程序快?