什么“类型变量”意味着它们出现在SML中的`val`声明语句中

时间:2015-06-08 13:39:57

标签: sml

在SML / NJ repl中,接受以下表达式:

- val 'a a = [];
val a = [] : 'a list
- val 'a a = 1;
val a = 1 : int

'a在这里意味着什么?我不知道它们会产生什么影响,这是在定义中定义的,但我在标准ML 编程中找不到相关描述。

请!

1 个答案:

答案 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

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

答案是SML实际上选择了后一种解释:如果在没有显式绑定点的注释中使用类型变量,那么它的范围是最小的包含声明,其中包含所有出现的相同变量< / em>的

有时甚至是你想要的。但显然,最好能够明确它,而不是依赖棘手的隐式范围规则。