LSR 012 - 元组类型规范

基本信息

  • LSR 编号 012

  • 标题 元组类型规范

  • 作者 Ziyang-Bai

  • 状态 草案

  • 类型 标准规范

  • 创建日期 08-09-2026

  • 归属项目 编译器、标准库

摘要

定义 Lamina 元组类型。元组是固定长度、按位置索引、创建后不可变的匿名积类型,可用于函数返回、临时组合和模式匹配 [1]

技术规范

1. 范围

元组用于组合少量按位置区分的值。元组不是数组:长度属于类型,元素类型可以不同。元组也不是 ADT [2]:它没有构造器标签,不能追加命名分支。

元组不定义空元组和单元素元组。

2. 元组类型

元组类型由一组有序元素类型组成。

(int, text)
(int, text, Expr)
  • 元组长度固定

  • 元组元素可以是不同类型

  • 元组类型由长度和每个位置的类型共同决定

  • 元组值默认不可变

3. 元组字面量

元组字面量使用圆括号。

let pair = (1, "one")
let triple = (1, "x", true)
  • 非空元组按元素表达式推导类型

  • 元组字面量至少包含两个元素

  • 单元素圆括号表达式不是元组

let a = (1)      # int
let b = (1,)     # 非法,单元素元组不属于本规范

4. 空元组

空元组不属于本规范。

  • () 不作为元组字面量解析

  • 不得把 () 当作零字段元组推导

  • 无返回值函数仍由现有返回语义定义

5. 元组访问

元组元素按位置访问,索引从 1 开始,与 Lamina 现有线性代数索引规则保持一致。

let p = (10, "x")
let a = p.1
let b = p.2
  • 元组索引必须是编译期常量正整数

  • 访问位置超过元组长度是编译错误

  • 元组位置访问不等同于对象字段修改

6. 元组解构

元组可在 letmatch 中解构。

let (x, y) = (1, 2)

match value {
    (a, b) => a + b
}
  • 解构模式长度必须与元组长度一致

  • _ 可忽略对应位置

  • 解构绑定的变量类型由对应位置推导

7. 函数返回元组

函数可以返回元组作为单一返回值。

func divmod(a int, b int) -> (int, int) {
    return (a / b, a % b)
}

let (q, r) = divmod(10, 3)
  • Lamina 仍然是单返回值语言

  • 多个不同类型结果应使用元组返回

  • 多个同类型、无序数学结果应使用集合返回

8. 相等性与哈希

元组按位置结构比较。

  • 两个元组长度不同,则类型不同

  • 两个同类型元组逐位置相等时,整体相等

  • 只有所有元素可比较时,元组才支持 ==

  • 只有所有元素可哈希时,元组才可作为哈希键

  • 元组不自动获得排序关系

9. 与数组和集合的区别

类型

长度

元素类型

顺序

主要用途

元组

固定

可异构

有序

多值组合

数组

可变或运行期长度

通常同构

有序

程序式序列

集合 [3]

运行期大小

同构

无序

去重数学集合

10. 引用