【问题标题】:How to construct a tuple with only one element in standard ML?如何在标准 ML 中构造一个只有一个元素的元组?
【发布时间】:2020-11-19 20:17:26
【问题描述】:

在标准机器学习(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 类型元素的元组? 如果是这样,我们如何构造一个单元素元组,它的类型签名是什么?

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:

    我们能否在 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获得类似的东西:

    datatype 'a one = One of 'a
    fun fromOne (One x) = x
    

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

    【讨论】:

      猜你喜欢
      • 2012-10-04
      • 2012-03-22
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      • 2020-08-25
      相关资源
      最近更新 更多