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

Types 在ML中,空列表的类型是什么?,types,sml,ml,Types,Sml,Ml,我想知道我正在使用的SML中的空列表的具体类型是什么? 当我在解释器中键入[]时,我将退出: val it = []: 'a list 这正是我所期望的。但是,如果我要输入,那么说: fun f a = if a = 0 then [] else [[]]; 然后我得到: val f = fn: int -> 'a list list 这似乎意味着[]也具有“a列表”类型。这到底是如何工作的?在ML术语中,值有一个类型方案,而不是类型。类型方案是类型的集合。它是一个带有通配符的类型,

我想知道我正在使用的SML中的空列表的具体类型是什么? 当我在解释器中键入[]时,我将退出:

val it = []: 'a list
这正是我所期望的。但是,如果我要输入,那么说:

fun f a = if a = 0 then [] else [[]];
然后我得到:

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

这似乎意味着[]也具有“a列表”类型。这到底是如何工作的?

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

在“列表”中,a是一个类型变量,即通配符。空列表[]可用于作为类型方案“a列表”实例的任何类型。也就是说,对于任何类型T,空列表具有类型T列表。例如,空列表有类型int list和类型bool list,以及类型int*int*int list和类型int list等等。所有这些类型都是类型方案“a列表”的实例

当一个变量出现多次时,必须始终替换它。例如,fn x=>x标识函数的类型为scheme'a->'a;它有int->int类型和bool->bool类型,但没有int->bool类型。类型为scheme“A->”b的值也将具有int->bool类型

一个值可以有多种类型-这是编程语言中的常见现象。核心ML语言的一个特性是,类型良好的值的类型集恰好是类型方案的实例集。这个属性称为principal:ML的类型系统是principal。ML的具体实现往往有公国的例外;例如,由于运算符fn x=>x+x的重载,SML有一个异常,它有两种类型int->int和float->float,如果上下文不施加float,重载解析规则会导致编译器决定int->int

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

通配符可以替换为类型方案。这将产生另一个类型方案,它是原始集合的子集,即类型方案是原始集合的一个细化的较小类型方案。例如,值[[]]具有类型方案“a列表:对于任何类型T,它具有类型T列表。[[]]具有类型int列表、类型bool列表和类型int*int*int列表等


在关于ML的文献中,“type”经常与“type scheme”互换使用,因此通常说“空列表具有类型‘a list’”。在关于类型系统的文献中,“类型”通常意味着ML术语所称的“类型方案”,而“地面类型”等其他术语则用于无变量的类型。

您是否特别困惑于最终类型中仍然存在“a”,或者如果a=0,您是否会遇到同样的问题,如果a=0,则[]else[1]的类型为[]突然变为int list?是的,我明白你的意思-我猜我的困惑是因为我同时查看了两个类型签名-即,我错误地认为第一个类型中的“a”必须与第二个类型签名中的“a”相同-但现在一切都有意义了,谢谢:。非常感谢澄清术语!