标签函数类型
这是当前编译器在独立实现基线之上增加的语言规则。标签属于函数类型,按参数位置核对,检查后擦除。本文与文言稿同步。
签一:语法
「差」乃化(「被减数」为「整数」)而化(「减数」为「整数」)而「整数」也。
「差」者会(「被减数」为「甲」)而会(「减数」为「乙」)而「减」于「甲」于「乙」也。
「差」于(「被减数」为「一零」)于(「减数」为「三」)。
「标签」为 式 是标签项。它可作 化 的定义域、遇 的参数类型、会 的绑定参数、于 的实参或构造器模式实参。标签项在其他位置报错。会 的标签项右边须为局部名称;遇 仍以 者「局部名」 绑定函数体。
标签须为非空名称,数字记号、注释和编译器内部名称不可作标签。标签文字独立于名称环境,局部名可以与标签相同。标签允许重复,各位置的真实参数类型可以不同。
〇为〇 沿用词法与语法语二的通用默认规约,与其他操作符的显式规约关系表保持原状。唯一可解析时可省括号,如 化「值」为「整数」而「整数」、会「值」为「物」而「物」。遇未定义关系时以括号分组;复杂右项也可独立括起。会〇而〇 的首元素只接受标签项;普通 会□而〇 继续处理普通绑定。
签二:类型规则
记普通箭头为 A→B,标签箭头为 ~签:A→B。
| 规则 | 普通箭头 | 标签箭头 |
|---|---|---|
| 形成 | A、B 均为类型 | A、B 均为类型且标签合法 |
| 引入 | 将局部名按 A 加入环境,按 B 检查体 | 将局部名按 A 加入环境,按 B 检查体;定义的标签须为签 |
| 消去 | 实参按 A 检查 | 实参标签须为签,实参值按 A 检查 |
| 相等 | 域与结果逐项相等 | 标签文字、域与结果逐项相等 |
遇 在验参数类型后合成函数体类型,按参数有无标签合成相应箭头。标签保持原文,局部变量依原有绑定规则换名。
两种箭头是独立的类型构造。完整标签函数类型可以作为类型别名、参数、返回值、元组项、容器元素或泛型类型实参。变量、条件选择和调用返回的函数值均按完整类型检查。
合一比较标签和子类型。待求类型变量可以解为完整标签函数类型;独立标签项是参数描述,不能作为待求类型变量的解。期望普通回调的位置须接收普通函数;可用普通匿名函数调用标签函数来显式转接。
签三:应用与模式
第 n 个实参对应第 n 个形参,标签与真实类型均逐位检查。带标签位须写同一标签;普通位直接写实参。标签重复时仍按位置处理。
参数组、完全应用、字面右箭头展平、返回函数类型别名另起一组、隐式 承 与 授以 均沿用原有规则。隐式参数为类型参数,标签项不能作为其类型实参。
隐式参数求解预读实参时穿过标签包装,按真实域类型匹配;读取类型的四种入口与一次有序推定规则见类型与模块类四。实参值、构造器子模式与局部变量按剥去标签后的真实类型检查。
签四:擦除与边界
类型检查后调用与模式中的标签包装消失。带类型抽象的域中保留标签,供阶段文件、接口类型、相等与悬停使用,随后随类型标注擦除。标签不参与自由变量、名称查找或换名。
运行时实参顺序、求值交错、尾位置、直接调用与原有整数去装箱保持原规则。构造器字段形、签名类别和宿主边界形按真实类型计算。无体声明按各参数有无标签合成相应匿名函数;宿主字段名和 Wasm 参数形照旧。
JSON 与豫言阶段源码保存标签项和未检查的标签抽象。标签项有一个子式;标签抽象有一个绑定体;检查后的阶段拒绝残留的未检查标签抽象。悬停与文档签名显示 (「标签」为 类型)。
签五:实现范围
普通值函数、匿名函数、值构造器与模式、GC 和底层模式、无体接口签名均适用。首版的类型构造器参数和着色语言遇标签时给出明确诊断。默认值、可变参数、乱序调用、部分应用、标签简写和自动转接均维持既有语言边界。
当前编译器已删除 循□以〇。顶层递归以紧邻的完整签名与定义建立;局部递归写 递归虑。仓内原来 循「名」以 的用例已改用上述签名递归。