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 -> int
和 float -> 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 术语中所说的“类型方案”,而其他术语(如“基础类型”)用于没有变量的类型。
我想知道空列表在 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 -> int
和 float -> 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 术语中所说的“类型方案”,而其他术语(如“基础类型”)用于没有变量的类型。