ML中空列表的类型是什么?

What is the type of the empty list in ML?

我想知道空列表在 SML 中到底是什么类型(我使用的是 PolyML)? 当我在解释器中输入 [] 时,我得到了:

val it = []: 'a list

这是我所期望的。但是,如果我输入 say:

fun f a = if a = 0 then [] else [[]];

然后我得到:

val f = fn: int -> 'a list list

这似乎暗示 [] 也有类型 'a list list。这究竟是如何工作的?

在 ML 术语中,值具有 类型方案,而不是类型。类型方案是类型的集合。它是一种带有通配符的类型,通配符可以被任何类型替换。按类型替换通配符称为实例化类型方案。

'a list中,'a是类型变量,即通配符。空列表 [] 可用于类型方案 'a list 实例的任何类型。也就是说,对于任何类型 <em>T</em>,空列表的类型为 <em>T</em>列表。例如,空列表有类型 int list 和类型 bool list 以及类型 (int * int * int) list 和类型 int list list 等等。所有这些类型都是类型方案 'a list.

的实例

当一个变量多次出现时,必须一致地替换它。例如 fn x => x(恒等函数)的类型方案为 'a -> 'a;它有类型 int -> int 和类型 bool -> bool 但没有类型 int -> bool。具有类型方案 'a -> 'b 的值也将具有类型 int -> bool

一个值可以有多种类型——这是编程语言中的普遍现象。这是核心 ML 语言的一个 属性,一个类型良好的值的类型集恰好是一个类型方案的实例集。这个属性叫做principality:ML的类型系统是principal。 ML 的具体实现往往有原则性的例外;例如 SML 由于运算符重载而出现异常(fn x => x + x 有两种类型 int -> intfloat -> float,并且重载解析规则导致编译器决定 int -> int如果上下文没有强加 float).

其主要类型方案包含至少一个变量的值被称为多态。其主要类型方案不包含变量的值被称为 单态 .

通配符可以用类型方案代替。这会产生另一种类型方案,它是原始集合的子集,即类型方案是原始类型方案的较小类型方案(细化)。例如,值 [[]] 的类型方案为 'a list list:它的类型为 <em>T</em> list list for any type <em>T</em>[[]] 有类型 int list list 和类型 bool list list 和类型 (int * int * int) list list

在关于ML的文献中,“类型”经常与“类型方案”互换使用,所以通常说“空列表的类型为'a list”。在有关类型系统的文献中,“类型”通常指的是 ML 术语中所说的“类型方案”,而其他术语(如“基础类型”)用于没有变量的类型。