Ocaml:“包含无法推广的类型变量”

时间:2015-08-28 09:53:31

标签: 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

有什么问题?

1 个答案:

答案 0 :(得分:2)

首先,您应该按照@didierc提供的链接阅读弱类型变量,以便了解它们存在的原因以及何时进入游戏。

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

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

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

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