LSR 006 - Lambda 表达式与类型推导规范¶
基本信息¶
LSR 编号 006
标题 Lambda 表达式与类型推导规范
作者 Ziyang-Bai
状态 草案
类型 标准规范
创建日期 04-05-2026
归属项目 编译器、通用
摘要¶
定义 Lambda 的语法、类型推导、闭包捕获与管道交互。Lambda 独立推导,返回类型由表达式推导。
技术规范¶
1. 设计目标¶
提供轻量匿名函数语法
与管道
|>平滑协作在保持静态强类型前提下支持局部推导
2. 语法¶
2.1 基础语法¶
|x| -> x + 1
|x, y| -> x * y
|x num, y num| -> x + y
规则:
|...|为参数列表->右侧为单表达式函数体Lambda 自身是表达式,可赋值、可传参、可返回
2.2 与命名函数语法的关系¶
命名函数:
func name(params...) -> ReturnType { ... }Lambda:
|params| -> expr
Lambda 返回类型由函数体表达式推导。
3. 类型推导规则¶
3.1 参数类型¶
可显式标注:
|x num| -> x + 1可省略标注:
|x| -> x + 1省略时依赖上下文约束推导参数类型
3.2 返回类型¶
返回类型由
->右侧表达式推导返回类型需可由上下文确定
若无法确定,编译报
LambdaTypeAmbiguous
3.3 上下文定型(contextual typing)¶
赋值上下文
let f = |x num| -> x^2
参数上下文
let out = map(vec[1,2,3], |x| -> x^2)
返回上下文
func make_inc() -> (num -> num) {
return |x| -> x + 1
}
4. 与管道 |> 的交互¶
4.1 一元函数管道¶
let res = vec[1,2,3,4]
|> filter(|x| -> x % 2 == 0)
|> map(|x| -> x^2)
4.2 歧义与优先级¶
|>左结合当 Lambda 参数列表与外层调用产生歧义时,必须加括号
let res = data |> map((|x| -> x + 1))
5. 闭包捕获规则¶
Lambda 可捕获外层
let绑定(只读)外层
var更新通过显式返回值传递若需更新状态,必须显式通过返回值传递新状态
let base = 10
let add_base = |x| -> x + base
6. 与值语义/COW 的关系¶
捕获复合类型(
vector,matrix,table,set)见 LSR-000 第 4.6 节只读捕获不触发复制
若 Lambda 内部对局部可变副本突变,触发 COW,不回写原对象
7. 错误与诊断¶
LambdaTypeAmbiguous: Lambda 参数或返回类型无法由上下文确定LambdaCaptureMutation: 非法写入外层var捕获LambdaArityMismatch: 传入参数个数与 Lambda 形参不一致
8. 与其他 LSR 的关系¶
LSR-000:定义核心类型系统、局部推导总原则与管道运算符
LSR-005:match 规范来源