集合、类型和类型检查

这是一篇关于类型理论的深入探讨文章,涵盖了类型的各种概念、操作和在编程语言中的应用,主要内容如下:

  • 类型的作用

    • 提供程序结构信息,帮助检查程序错误,如在无效程序中标识类型不匹配的地方。
    • 为程序优化提供信息,例如在 C 语言中提供类型信息可使 CPU 使用更优寄存器。
    • 为程序员提供一种在程序和代码中描述和理解数据的方式,有助于更好地组织程序和理解需要完成的任务。
  • 什么是类型

    • 类型描述数据,基于属性进行分类,属性可以是数据的可测量特征或与系统其他部分的关系。
    • 类型有成员,满足特定属性的值可以被视为类型的成员,例如“⊢ 🚒: fire truck”表示🚒是消防车类型的成员。
    • 基本类型有any(包含所有值,没有特定要求的属性)和never(没有可构造的成员,包含所有可能的构造属性,用于表示函数永远不会退出的情况)。
  • 类型的共轭

    • 有两种类型的二进制共轭:and类型(交集类型)和or类型(并集类型或和类型)。
    • and类型表示两个类型的交集,成员必须同时满足左右两侧的属性,例如RainForest = ContinousTreeCanopy & HighHumidity
    • or类型表示两个类型的并集,成员可以满足左侧或右侧的属性,例如Trait = CargoTrain | PassengerTrain
    • 共轭类型遵循布尔代数的根,并且可以相互分布和简化。
  • 参数化类型(泛型)

    • 用于建模依赖于某种类型的结构,通过在定义中添加类型参数来指定在特定位置插入类型。
    • 类型参数可以是其他类型,并且可以通过部分应用来实例化泛型,生成特定类型的实例。
    • 部分应用的泛型通过PartiallyAppliedGenerics结构来提高效率,避免每次实例化都复制内部结构。
  • 特殊根类型

    • 产品类型/元组/对:可以将类型连接起来,元组可以是异构的,而数组通常是同质的。对象/结构体是一种特殊的产品类型,通过字符串键来引用字段。
    • 函数:函数是类型理论中的基本类型,代表值之间的转换,包括参数类型、返回类型、默认参数、可变参数、柯里化、自由变量和闭包等特性。
    • 条件类型:其属性取决于条件的类型,在函数返回类型中可以根据条件选择不同的分支。
    • 类型层次结构:展示了各种类型之间的包含关系,如any包含一切,never是特殊的空类型等。
  • 类型操作

    • 子类型化:测试一个类型是否是另一个类型的子集,在函数参数、返回类型、变量赋值等多处都有应用,可以提高类型检查的效率。
    • 不相交性:测试两个类型的交集是否为空,用于确定类型之间是否相互排斥,在等式定义、交集类型定义和类型别名循环检测等方面有作用。
    • 读取类型的“属性”:在处理对象属性、函数调用、类型参数替换等情况下,需要手动进行类型检查,而不仅仅依赖子类型化和不相交性操作。
  • 类型检查过程

    • 类型检查是执行上述操作的过程,涉及遍历抽象语法树(AST),对模块或文件中的每个部分进行类型检查。
    • 上下文用于存储变量名到类型的映射以及命名类型到类型的映射,帮助在系统中引用类型和推理表达式。
    • 类型注释用于添加类型信息,而类型声明如别名和接口则有不同的行为。逐渐类型化允许在代码中省略一些类型注释,any用于表示缺失的注释。
  • 推理

    • 推理过程基于上下文形成类型,包括推断变量约束、类型参数、函数参数类型和返回类型等。
    • 反射和窄化/细化类型通过typeofinstanceof等表达式来根据类型进行条件判断,以更精确地处理类型。
  • 类型与值的关系及未知性

    • 依赖类型用于在 JavaScript 中处理标记联合数据,5可以被视为具有特定行为的数字类型。
    • 在一些系统中,有const修饰符用于处理类型参数,以更严格地控制参数的类型。

文章还提到了后续将探讨的内容,如 Curry-Howard 同构和 Rust 生命周期类型,以及关于反射和计算性类型检查的剩余材料。

阅读 15
0 条评论