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

How to construct a tuple with only one element in standard ML?

在标准ML(Standard ML of New Jersey)中,我们使用如下语法构造元组

val x = (1, 2);
val u = ();

但是我们不能构造只有一个元素的元组

val x = (1); (* normal int *)
val y = (1,); (* python syntax, not valid in SML *)

另一方面,一个元素元组和元素本身似乎具有相同的类型签名。

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

Can we distinct 'a and a tuple with only one element of type 'a in SML?

是的,你可以。

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

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

- #1 foo;
val it = 42 : int

您可以通过尝试将常规二元组注释为记录来看到这实际上是一个一元组:

- (3.14, "Hello") : { 1 : real, 2 : string };
val it = (3.14,"Hello") : real * string

what's type signature of it?

类型为 { 1 : 'a }。您可以像这样保留类型参数:

type 'a one = { 1 : 'a };

您可以使用 datatype:

得到类似的东西
datatype 'a one = One of 'a
fun fromOne (One x) = x

我认为它们会使用相同数量的内存。