当'type variables'出现在SML中的'val'声明语句中时,它们是什么意思

当'type variables'出现在SML中的'val'声明语句中时,它们是什么意思,sml,Sml,在SML/NJ repl中,接受以下表达式: - val 'a a = []; val a = [] : 'a list - val 'a a = 1; val a = 1 : int 这里的'a是什么意思?我不知道它们会产生什么影响,这是在定义中定义的,但我在标准ML的编程中找不到相关的描述 求你了 由val绑定的类型变量只有在使用它们时才相关。您可以使用它们强制(或限制)多态性,例如 fun 'a pair (x : 'a, y : 'a) = (x, y) 它是 val 'a pair

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

- val 'a a = [];
val a = [] : 'a list
- val 'a a = 1;
val a = 1 : int
这里的
'a
是什么意思?我不知道它们会产生什么影响,这是在定义中定义的,但我在标准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

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

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


有时候这甚至是你想要的。但是很明显,最好能够明确地说明它,而不是依赖于复杂的隐式作用域规则。

变量因值而异:变量“x”的类型为int,它可以有值1、2、3、4或任何其他int。类型变量因类型而异:“列表是具有未知基类型的列表的类型。当你想要一个不关心参数基类型的函数时,它们就起作用了。例如,对于length函数,不管它是在计算和int list还是char list的长度。每当你看到一个类型变量,你都可以把它解释为代表任何类型…也就是说,它有助于将一个类型赋予多态函数。我知道了,非常感谢。顺便说一句,你能告诉我在哪里可以得到关于SML的多态性和单态性知识的系统描述吗?我不知道编译器和类型检查器是如何工作的。谢谢
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