Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

附录B:符号速查表

本附录是一个参考型速查表,适合在阅读正文时随时回查。
它的目标不是替代正文解释,而是帮助你快速确认:

  • 某个符号怎么读;
  • 它大致表示什么;
  • 它在本教程的哪类语境中出现。

使用方式建议:

  • 第一次阅读正文时,不必强行记住全部符号;
  • 遇到不熟悉的记号时,再回到这里查;
  • 若你想看更完整的术语解释,请配合附录A“术语表”一起使用。

阅读提醒:

  • 同一个符号在不同章节里,可能处在不同层级;
  • 例如第 7 章的 ∀X.T 是对象语言中的全称类型,而第 9 章的 ∀α.T 更常出现在 HM 风格环境中的类型方案(type scheme);
  • 又例如第 7 章的 X, Y 通常表示显式多态系统中的类型变量,而第 9 章的 α, β, γ 通常表示推断过程中临时生成的未知类型占位符。

一、逻辑与判断相关记号

记号常见读法含义常见语境
逻辑合取(and)命题逻辑、性质并列
逻辑析取(or)命题逻辑、分类讨论
蕴含 / 如果……那么……逻辑蕴含规则描述、性质定义
对所有 / 任意全称量词多态、数学定义
存在存在量词存在类型、数学定义
可推出 / 可判断为在某套规则系统中可以推出某结论类型判断、推导系统
在环境 下, 的类型是 类型判断第5章及以后
环境中查找 的类型环境查找结果类型规则

说明:
$\vdash$ 不应简单理解成普通语言里的“所以”。它通常表示:
在某个形式系统的规则之下,可以推出右边的判断。


二、Lambda 演算相关记号

记号常见读法含义常见语境
lambda x 点 t函数抽象(函数定义)第3章起
应用于 函数应用第3章起
t 的自由变量集合自由变量集合第3章
中的 替换为 项替换第3章、第4章
α-等价绑定变量重命名后的等价第3章
β-归约到一步 β-归约第4章
归约到 / 一步归约到一步计算关系第4章起
多步归约到零步或多步归约第4章起
t 求值为 v大步语义中的求值关系第4章
Omega经典发散项第4章
redex可归约表达式形如 的可归约子项或位置第4章
eta常用于 η-归约或 η-等价的记号第4章(补充概念)

说明:
$[x \mapsto s]t$`` 中的 ` 在这里读作“替换为”最自然;
但在别的上下文里,它也可能只是一般意义上的“映射到”。


三、类型系统相关记号

记号常见读法含义常见语境
$T, U, S$类型元变量 / 类型占位记号表示任意类型的占位符,不是对象语言里的类型变量全书
$A, B$基础类型或一般类型名视上下文而定第5章起
$T_1 \to T_2$从 $T_1$ 到 $T_2$函数类型第5章起
$\text{Bool}$Bool布尔类型第5章起
$\text{Nat}$Nat自然数类型第5章起
$\text{Unit}$Unit单位类型第6章
$T_1 \times T_2$积类型 / 乘积类型同时包含两个部分的类型第6章
$T_1 + T_2$和类型 / 和二选一的类型第6章
${l_1:T_1,\dots,l_n:T_n}$记录类型带字段名的类型第6章、第8章
$\mu X.T$mu X 点 T递归类型第6章
$\text{fold}(t)$fold t把展开后的递归结构重新包回递归类型第6章
$\text{unfold}(t)$unfold t把递归类型打开一层第6章
$\text{Ref}(T)$Ref of T / T 的引用类型可变引用类型第6章
$\forall X.T$对所有类型 $X$,$T$全称类型第7章
$\exists X.T$存在某个类型 $X$ 使得 $T$存在类型第7章
$\Lambda X.t$大 Lambda X 点 t类型抽象第7章
$t[T]$t 作用于类型 T类型应用第7章
$\text{pack}$pack存在类型中的打包(packing)构造第7章
$\text{unpack}$unpack存在类型中的拆包(unpacking)构造第7章
$S <: T$S 是 T 的子类型子类型关系第8章

说明:

  • <span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 中的箭头表示函数类型,不是程序执行步骤。
  • <span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7224em;vertical-align:-0.0391em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&lt;:</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span></span></span></span> 表示“S 可以安全地用在需要 T 的地方”。

四、类型推断与合一相关记号

记号常见读法含义常见语境
$\alpha, \beta, \gamma$类型变量推断中的未知类型占位符第9章
$\sigma$替换 sigma把类型变量映射为类型的替换第9章
$T\text{-}Sub$T-Sub / subsumption把已有类型提升到其超类型的类型规则第8章
$\sigma(T)$把替换 $\sigma$ 作用到类型 $T$ 上替换作用结果第9章
$\sigma_2 \circ \sigma_1$替换组合先做 $\sigma_1$,再做 $\sigma_2$第9章
$\text{unify}(\cdots)$合一求解类型等式第9章
$\forall \alpha.T$对类型变量 $\alpha$ 全称量化HM 风格类型方案中的量化第9章
$\text{Gen}(\Gamma, T)$在环境 $\Gamma$ 下泛化 $T$泛化操作第9章
$\text{Inst}(Sch)$实例化一个类型方案把类型方案中的量化变量替换为新鲜类型实例第9章
$Sch$scheme / 类型方案HM 风格环境中记录的一族类型第9章

说明:
在第9章里,$\alpha,\beta,\gamma$ 通常不表示“真实语言中的泛型参数”,
而是推断算法中临时生成的未知类型占位符


五、子结构类型系统相关记号

记号常见读法含义常见语境
$\text{lin}$linear线性限定符第10章
$\text{un}$unrestricted无限制限定符第10章
$A \multimap B$线性函数类型线性地消耗一个 $A$,产生一个 $B$第10章
$\Gamma_1 \circ \Gamma_2$环境分裂 / 环境组合表示线性系统中的环境拆分或对应组合第10章
Exchange交换规则允许调整环境中假设的顺序第10章
Weakening弱化规则允许引入未使用的变量假设第10章
Contraction收缩规则允许重复使用同一假设第10章

本教程约定:
<span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord">Γ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∘</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord">Γ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 不是所有教材里都统一采用的通用记号。
在本教程中,它专门表示:

  • 两个环境之间的线性分裂 / 组合关系;
  • 直觉上可理解为“把资源分给左右两个子推导”。

阅读第10章时,请始终按这个约定理解它。


六、正文中常见的元变量约定

这些不是“语言里的变量”,而是作者在讲解时常用的元变量

记号常见含义
$t, s, u$项(term)
$x, y, z$程序变量
$v$值(value)
$T, U, S$类型(元变量)
$X, Y$类型变量(多见于第 7 章显式多态系统)
$\alpha, \beta, \gamma$推断中的未知类型变量(多见于第 9 章)
$\Gamma$类型环境 / 上下文
$\sigma$替换
$Sch$类型方案(type scheme)
$e$表达式(有时用于一般表达式语言)

提醒:
元变量是“讲解语言”的记号,不是目标语言本身的一部分。
例如 <span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">::=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∣</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">λ</span><span class="mord mathnormal">x</span><span class="mord">.</span><span class="mord mathnormal">t</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∣</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span><span class="mspace"> </span><span class="mord mathnormal">t</span></span></span></span> 里的 t 是在描述“任意项”的元变量,不是程序里真的有个变量叫 t

特别注意:

  • 第 7 章里的 <span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span></span></span></span> 通常表示对象语言类型中的类型变量;
  • 第 9 章里的 <span class="katex"><span class="katex-html" aria-hidden="true"><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">a</span><span class="mord mathnormal">lp</span><span class="mord mathnormal">ha</span><span class="mpunct">,</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">b</span><span class="mord mathnormal">e</span><span class="mord mathnormal">t</span><span class="mord mathnormal">a</span><span class="mpunct">,</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">amma</span></span></span></span> 通常表示推断算法临时生成的未知类型占位符;
  • 两者都可被叫作“类型变量”,但层级和用途并不相同。

七、容易混淆的符号对照

记号不要和什么混淆区别
$T_1 \to T_2$$\longrightarrow$前者是函数类型,后者是归约关系
$\lambda x.t$$\Lambda X.t$前者是值层面抽象,后者是类型层面抽象
$[x \mapsto s]t$$\sigma(T)$前者是项替换,后者通常是类型替换 / 替换作用
$\equiv_\alpha$$\longrightarrow_\beta$前者是等价关系,后者是一步归约关系
$\forall X.T$$\forall \alpha.T$前者多见于第 7 章的显式多态对象语言,后者多见于第 9 章 HM 风格类型方案(type scheme)
$\forall X.T$$\exists X.T$前者是全称类型,后者是存在类型
$S <: T$$S = T$前者是子类型关系,后者是相等
$\Gamma \vdash t : T$$t \Downarrow v$前者是类型判断,后者是求值关系
$\mu X.T$无限展开的类型前者是显式递归类型构造,后者通常是第 9 章 occur check 要阻止的隐式无限类型(infinite type)
$\text{fold}(t)$ / $\text{unfold}(t)$直接类型相等前者对应 iso-recursive 视角下的显式往返,后者不是“自动视为同一类型”

八、最后的阅读建议

如果你在阅读正文时总是被符号绊住,可以优先只抓住下面这几类最核心记号:

  1. 项的形状

    • $\lambda x.t$
    • $t_1\ t_2$
  2. 类型判断

    • $\Gamma \vdash t : T$
  3. 计算关系

    • $\longrightarrow$
    • $\Downarrow$
  4. 多态与子类型

    • $\forall X.T$
    • $S <: T$
  5. 资源使用

    • $\text{lin}$
    • $\text{un}$

先把这些记号读顺,再回头看更细的符号,通常会轻松不少。