LSR 012 - 元组类型规范 ================================================================================ 基本信息 -------------------------------------------------------------------------------- - LSR 编号 012 - 标题 元组类型规范 - 作者 Ziyang-Bai - 状态 草案 - 类型 标准规范 - 创建日期 08-09-2026 - 归属项目 编译器、标准库 摘要 -------------------------------------------------------------------------------- 定义 Lamina 元组类型。元组是固定长度、按位置索引、创建后不可变的匿名积类型,可用于函数返回、临时组合和模式匹配 [1]_。 技术规范 -------------------------------------------------------------------------------- 1. 范围 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 元组用于组合少量按位置区分的值。元组不是数组:长度属于类型,元素类型可以不同。元组也不是 ADT [2]_:它没有构造器标签,不能追加命名分支。 元组不定义空元组和单元素元组。 2. 元组类型 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 元组类型由一组有序元素类型组成。 .. code-block:: text (int, text) (int, text, Expr) - 元组长度固定 - 元组元素可以是不同类型 - 元组类型由长度和每个位置的类型共同决定 - 元组值默认不可变 3. 元组字面量 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 元组字面量使用圆括号。 .. code-block:: text let pair = (1, "one") let triple = (1, "x", true) - 非空元组按元素表达式推导类型 - 元组字面量至少包含两个元素 - 单元素圆括号表达式不是元组 .. code-block:: text let a = (1) # int let b = (1,) # 非法,单元素元组不属于本规范 4. 空元组 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 空元组不属于本规范。 - ``()`` 不作为元组字面量解析 - 不得把 ``()`` 当作零字段元组推导 - 无返回值函数仍由现有返回语义定义 5. 元组访问 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 元组元素按位置访问,索引从 1 开始,与 Lamina 现有线性代数索引规则保持一致。 .. code-block:: text let p = (10, "x") let a = p.1 let b = p.2 - 元组索引必须是编译期常量正整数 - 访问位置超过元组长度是编译错误 - 元组位置访问不等同于对象字段修改 6. 元组解构 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 元组可在 ``let`` 和 ``match`` 中解构。 .. code-block:: text let (x, y) = (1, 2) match value { (a, b) => a + b } - 解构模式长度必须与元组长度一致 - ``_`` 可忽略对应位置 - 解构绑定的变量类型由对应位置推导 7. 函数返回元组 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 函数可以返回元组作为单一返回值。 .. code-block:: text func divmod(a int, b int) -> (int, int) { return (a / b, a % b) } let (q, r) = divmod(10, 3) - Lamina 仍然是单返回值语言 - 多个不同类型结果应使用元组返回 - 多个同类型、无序数学结果应使用集合返回 8. 相等性与哈希 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 元组按位置结构比较。 - 两个元组长度不同,则类型不同 - 两个同类型元组逐位置相等时,整体相等 - 只有所有元素可比较时,元组才支持 ``==`` - 只有所有元素可哈希时,元组才可作为哈希键 - 元组不自动获得排序关系 9. 与数组和集合的区别 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. list-table:: :header-rows: 1 * - 类型 - 长度 - 元素类型 - 顺序 - 主要用途 * - 元组 - 固定 - 可异构 - 有序 - 多值组合 * - 数组 - 可变或运行期长度 - 通常同构 - 有序 - 程序式序列 * - 集合 [3]_ - 运行期大小 - 同构 - 无序 - 去重数学集合 10. 引用 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. [1] :doc:`LSR-000 - Lamina 核心语言规范(草案) ` - 提供基础类型、函数返回和模式匹配语法 .. [2] :doc:`LSR-011 - 代数数据类型规范 ` - 定义 ADT;元组可作为 ADT 字段 .. [3] :doc:`LSR-013 - 集合类型规范 ` - 定义集合;集合元素可以是可哈希元组