【问题标题】:Ocaml: "contains type variables that cannot be generalized"Ocaml:“包含无法泛化的类型变量”
【发布时间】:2015-08-28 22:41:24
【问题描述】:
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

有什么问题?

【问题讨论】:

标签: ocaml typeerror


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多