Syntax OCaml约束中隐式类型变量的作用域
在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绑定还是顶
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
表达式的相互集合。这是一个打字原语。我已经重写了答案。希望现在会更好。