当'类型变量'出现在SML的' val '声明语句中时,它们是什么意思?



在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

在前一种情况下,pairtriple在单态f中都是完全多态的,在后者中,它们将是单态的,相对于(多态)f的实例化!

答案是SML实际上选择了后一种解释:如果您在没有显式绑定点的注释中使用类型变量,则其作用域是包含同一变量的所有出现的最小的封闭声明。

有时候这就是你想要的。但是很明显,最好是能够显式地描述它,而不是依赖于棘手的隐式作用域规则。

最新更新