Skip to content

定义Definition

Kind 与类型算子

Kind · Type operator · Higher-kinded type

用简单kind判断区分完整类型、部分应用的构造器与接收类型算子的高阶算子。

形式陈述 ​

Kind为类型表达式分类,区分“完整的值类型”和“还要接收类型参数的算子”。本页采用最简单的kind语言:

κ::=∗∣κ→κ.

∗ 表示可以用来分类程序值的类型,例如Int、Bool、Int→Bool。κ1→κ2 表示接收一个kind为 κ1 的类型表达式、产生kind为 κ2 的类型表达式的算子。箭头右结合;∗→∗→∗ 是 ∗→(∗→∗)。

像项的类型判断一样,类型层有判断 Δ⊢T:κ。环境Δ记录类型变量的kind。为避免把项与类型混在同一个冒号后面,本页用Γ记录项变量,用Δ记录类型变量。

固定常量Int、Bool、List、Pair,其中

Int:∗,Bool:∗,List:∗→∗,Pair:∗→∗→∗.

List和Pair在这里是给定类型构造器,不需要展开它们的数据定义。类型层还允许抽象与应用,主要规则为

X:κ∈ΔΔ⊢X:κ,Δ,X:κ1⊢T:κ2Δ⊢λX:κ1.T:κ1→κ2,Δ⊢T:κ1→κ2Δ⊢U:κ1Δ⊢T U:κ2,Δ⊢T:∗Δ⊢U:∗Δ⊢T→U:∗.

项函数类型 T→U 与kind箭头看起来相同,但两侧对象不同:前者的T、U是类型,后者的 κ1,κ2 是kind。类型应用左结合,所以 Pair Int Bool 是 (Pair Int) Bool。

直觉

把List想成一个留有空格的类型模板。填入Int得到整数列表,填入Bool得到布尔列表。List本身还没说元素是什么,因而不能在这个系统里直接写一个普通变量声明 xs:List。

Pair留有两个空格。先填Int得到 Pair Int:*→*,还可以再填Bool得到 Pair Int Bool:*。部分应用没有失败,只是结果仍是类型算子。

类型层的λ与λ演算形式相似,不过参数是类型表达式而不是运行时整数或函数值。λX:*.Pair X Bool描述“把X与Bool配成一对”的类型变换;它没有分配一个二元组,也没有创建一个运行时闭包。

例子与边界

一个接收类型算子的算子 ​

考虑

K=λF:∗→∗.F Int.

逐步检查:在 F:∗→∗ 的环境下,Int的kind为 ∗;应用规则给出 F Int:∗;移去F假设并作类型抽象,得到

K:(∗→∗)→∗.

于是K List合法,结果是List Int。K (Pair Bool)也合法,结果是Pair Bool Int。K Int则不合法,因为K要求的实参kind是 ∗→∗,Int只具有 ∗。

下面四个判断把“尚未填完”与“填错位置”分开:

表达式 结果 理由
Pair Int ∗→∗ 合法部分应用
List (Pair Int Bool) ∗ List收到完整二元组类型
List List 拒绝 实参List不是 ∗
Int Bool 拒绝 Int没有函数kind,不能应用

List Int和List Bool的kind相同,类型却不同。Kind检查只保证类型表达式的接口匹配,不把同一kind内的所有类型判作相等;正如3和true都能出现于程序中,也不能据此认为它们类型相同。

三层对象不要互换 ​

3:Int是项判断,Int:*是类型表达式的kind判断。这里的 ∗ 不是Int的一个运行时值,也不是本页语言里可自行应用的类型算子。

本页只允许类型依赖类型,类型算子不能读取一个普通项变量n来计算“长度恰为n的数组类型”。那需要另行加入依赖项的类型规则。Kind与依赖类型中的宇宙也有联系,但简单箭头kind分类并不包含宇宙提升、累积性或 Type_i:Type_{i+1} 的规则,不能只凭“类型的类型”这句口号混用两套体系。

推论与应用

Kind检查可以按类型表达式的语法树递归执行:变量查Δ,应用先检查函数kind再比较参数kind,抽象扩展Δ。每一步下降到严格子表达式,因此对本页有限语法总会结束。检查器遇到 List List 时能在类型层报错,不必等待项级检查才发现问题。

System F只对普通类型量化;若还允许项在 F:∗→∗ 这样的算子上多态,就得到System Fω的一项关键扩展。容器接口可以用F A统一表示不同容器形状,但知道F的kind并不自动获得映射、遍历或比较操作;这些仍需函数参数、字典或其他接口证据。

一个实用自检是:对每个类型参数同时写出名字和kind。若接口接收的是List,就写 F:∗→∗;若接收的是List Int,就写 A:∗。这个区分能在设计接口时暴露“传模板”与“传模板实例”的混淆。

参考资料
  • Mark P. Jones, Typing Haskell in Haskell, 2000,§3:基本kind与类型构造器
  • Andrew M. Pitts, Lecture Notes on Types, 2015,§5.3:高阶类型构造与Fω
  • Benjamin C. Pierce, Types and Programming Languages, MIT Press, 2002,Chapter 29:类型算子
关系图谱6 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组