在SML / NJ repl中,接受以下表达式:
- val 'a a = [];
val a = [] : 'a list
- val 'a a = 1;
val a = 1 : int
'a
在这里意味着什么?我不知道它们会产生什么影响,这是在定义中定义的,但我在标准ML 编程中找不到相关描述。
请!
答案 0 :(得分:3)
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
内都是完全多态的,在后者中,它们将是单态的,相对于a(多态的实例化) )f
!
答案是SML实际上选择了后一种解释:如果在没有显式绑定点的注释中使用类型变量,那么它的范围是最小的包含声明,其中包含所有出现的相同变量< / em>的
有时甚至是你想要的。但显然,最好能够明确它,而不是依赖棘手的隐式范围规则。