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. 元组解构¶
元组可在 let 和 match 中解构。
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] |
运行期大小 |
同构 |
无序 |
去重数学集合 |