繁体   English   中英

OCaml约束中隐式类型变量的范围

[英]Scope of implicit type variables in OCaml constraints

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

let f g n = (g (n:'n):'n) ;;
val f : ('n -> 'n) -> 'n -> 'n = <fun>

显然可以重用这些类型变量(否则,这将是毫无意义的练习)。 但是,由于它们不是由某些特殊声明引入的,所以我想知道范围是什么? 是封闭函数,let绑定还是顶层语句?

有没有办法限制这种隐式引入的类型变量的范围?

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

每当引入新的类型变量时,都会在当前的键入上下文中对其进行查找。 如果已经引入,则它是统一的。 否则,将新类型变量添加到上下文。 (以后可以用于统一)。

一个例子来阐明这个想法:

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

在这里, 'a用来约束e中的x'a相同,后者用于在函数f约束xy 由于e xint类型统一,因此统一扩展到函数f ,将函数gh约束为int -> int类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM