在SML/NJ repl中,接受以下表达式:
- val 'a a = [];
val a = [] : 'a list
- val 'a a = 1;
val a = 1 : int
这里的'a
是什么意思?我不知道它们会产生什么效果,这是在定义中定义的,但是我在Programming in Standard ML中找不到相关的描述。
请!
由val
绑定的类型变量只有在使用它们时才具有相关性。您可以使用它们强制(或限制)多态性,例如
fun 'a pair (x : 'a, y : 'a) = (x, y)
是
的缩写val 'a pair = fn (x : 'a, y : 'a) => (x, y)
您可以编写相同的内容,而无需在开头添加显式的'a
。然而,作用域规则是相当棘手的,特别是当您在几个声明中使用'a
时。例如:
fun f () =
let
fun pair (x : 'a, y : 'a) = (x, y)
fun triple (x : 'a, y : 'a, z : 'a) = (x, y, z)
in
...
end
这是什么意思?至少有两种可能的答案:
fun f () =
let
fun 'a pair (x : 'a, y : 'a) = (x, y)
fun 'a triple (x : 'a, y : 'a, z : 'a) = (x, y, z)
in
...
end
或
fun 'a f () =
let
fun pair (x : 'a, y : 'a) = (x, y)
fun triple (x : 'a, y : 'a, z : 'a) = (x, y, z)
in
...
end
在前一种情况下,pair
和triple
在单态f
中都是完全多态的,在后者中,它们将是单态的,相对于(多态)f
的实例化!
答案是SML实际上选择了后一种解释:如果您在没有显式绑定点的注释中使用类型变量,则其作用域是包含同一变量的所有出现的最小的封闭声明。
有时候这就是你想要的。但是很明显,最好是能够显式地描述它,而不是依赖于棘手的隐式作用域规则。