在Ullman的SML书中:
我们可以从旧类型T1和T2构建新类型,如下所示。
T1 * T2是“产品”类型,其值是成对的。该对中的第一个组件的类型为T1,第二个组件的类型为T2。
T1-> T2是“函数”类型,其值是域类型T1和范围类型T2的函数。
我们可以通过跟随诸如T1之类的某些标识符(作为类型构造函数)来创建新类型。
(a)列表类型构造函数。也就是说,对于每种类型T1,都有另一个类型T1列表,其值是列出所有其元素是类型为T1。
(b)选项类型构造函数。对于每个T1类型,都有一个T1类型选项为NONE和SOME x,其中x是任何类型的值T1。
(c)其他类型构造函数ref,数组和向量。
我想知道产品类型中的*和函数类型中的->是否被视为类型构造函数?
如果不,为什么?
谢谢。
不是,但这主要是出于语法原因:*
和->
是关键字而不是标识符(在*
中不使用3 * 4 = 12
作为标识符是无关紧要的),我们(例如)写入int * real
和int -> real
而不是(int, real) *
和(int, real) ->
。
但是没有理由必须这样。可以想象一个标准ML的并行世界版本,该版本允许使用中缀类型构造函数(类似于3 + 4
表示op+ (3, 4)
的方式),并且仅将*
和->
定义为内置类型构造函数(类似于ref
或array
或vector
)。
事实上,即使在我们自己的宇宙中,我们也可以写:
type ('a, 'b) pair = 'a * 'b
type ('a, 'b) function = 'a -> 'b
创建类型构造函数pair
和function
,使得(int, real) pair
与int * real
同义,并且(int, real) function
与int -> real
同义。 (不是任何人want那个。)