Syntax OCaml约束中隐式类型变量的作用域

Syntax OCaml约束中隐式类型变量的作用域,syntax,types,ocaml,type-inference,Syntax,Types,Ocaml,Type Inference,在Ocaml中,可以在约束内引入新的类型变量,这对于在类型检查器中强制使用类型标识非常有用: let f g n = (g (n:'n):'n) ;; val f : ('n -> 'n) -> 'n -> 'n = <fun> 设fgn=(g(n:'n):'n);; val f:('n->'n)->'n->'n= 显然可以重用这些类型变量(否则这将是一个毫无意义的练习)。然而,由于它们不是由一些特别声明介绍的,我想知道有什么范围?它是封闭函数、let绑定还是顶

在Ocaml中,可以在约束内引入新的类型变量,这对于在类型检查器中强制使用类型标识非常有用:

let f g n = (g (n:'n):'n) ;;
val f : ('n -> 'n) -> 'n -> 'n = <fun>
设fgn=(g(n:'n):'n);;
val f:('n->'n)->'n->'n=
显然可以重用这些类型变量(否则这将是一个毫无意义的练习)。然而,由于它们不是由一些特别声明介绍的,我想知道有什么范围?它是封闭函数、let绑定还是顶级语句


有没有办法限制这种隐式引入的类型变量的作用域?

类型约束中使用的任何类型变量的作用域都是封闭let表达式的主体。如果一个表达式是相互递归的,那么范围将扩展到整个相互递归表达式集。范围不能缩小。Let表达式是一个类型化原语。无法隐藏或重写类型变量

每当引入新类型变量时,都会在当前类型上下文中查找它。如果它已经被引入,那么它是统一的。否则,将向上下文中添加一个新类型变量。(以后可以用于统一)

下面是一个阐明这一观点的例子:

let rec f g h x y = g (x : 'a) + h (y : 'a) and e (x : 'a) = x + 1;;

这里,在
e
中用于约束
x
'a
与在函数体
f
中用于约束
x
y
'a
相同。由于
e
中的
x
int
类型统一,因此统一扩展到函数
f
,将函数
g
h
约束为类型
int->int
,当然,这是漫长的一天。修好了。然而,你并没有真正回答我的问题。很明显,在我的示例中,这些类型变量的范围是整个let表达式,但一般规则是什么?一般规则是
let expression
let rec
表达式的相互集合。这是一个打字原语。我已经重写了答案。希望现在会更好。