Sml 如何在标准ML中构造只有一个元素的元组?

Sml 如何在标准ML中构造只有一个元素的元组?,sml,smlnj,Sml,Smlnj,在标准ML(新泽西州的标准ML)中,我们使用以下语法来构造元组 val x = (1, 2); val u = (); 然而,我们不能只用一个元素来构造元组 val x = (1); (* normal int *) val y = (1,); (* python syntax, not valid in SML *) 另一方面,一个元素元组和元素本身似乎具有相同的类型签名 我们能在SML中区分'a和只有一个'a类型元素的元组吗? 如果是这样,我们如何构造一个单元素元组以及它的类型签名是什么

在标准ML(新泽西州的标准ML)中,我们使用以下语法来构造元组

val x = (1, 2);
val u = ();
然而,我们不能只用一个元素来构造元组

val x = (1); (* normal int *)
val y = (1,); (* python syntax, not valid in SML *)
另一方面,一个元素元组和元素本身似乎具有相同的类型签名

我们能在SML中区分
'a
和只有一个
'a
类型元素的元组吗? 如果是这样,我们如何构造一个单元素元组以及它的类型签名是什么

我们能在SML中区分
'a
和只有一个
'a
类型元素的元组吗

是的,你可以

与Python不同,它没有任何特殊的
(1,)
语法。但是,由于元组等同于带有编号字段的记录,因此您可以创建一个只有一个名为
1
字段的记录,并使用
#1
宏访问该记录,以获取元组的第一个值:

- val foo = { 1 = 42 };
val foo = {1=42} : {1:int}

- #1 foo;
val it = 42 : int
通过尝试将常规的2元组注释为记录,可以看出这实际上是一个1元组:

- (3.14, "Hello") : { 1 : real, 2 : string };
val it = (3.14,"Hello") : real * string
它的类型签名是什么

类型应该是
{1:'a}
。可以按如下方式保留类型参数:

type 'a one = { 1 : 'a };
使用
数据类型
,可以得到类似的结果:

datatype 'a one = One of 'a
fun fromOne (One x) = x
我认为它们将使用相同的内存量