Skip to content

Simple Types

:material-circle-edit-outline: 约 783 个字 :material-clock-time-two-outline: 预计阅读时间 3 分钟

7 Product and Sum Types.pdf

整数变量放整数,类型变量放类型,前者常用希腊字母,后者常用罗马字母 \(\tau\)

image-20241030142646307

前者是函数的类型,后者是变量的类型

image-20241030142745323

纳尼,true 和 false 类型不一样

谁说 x 和 y 类型不一样

image-20241030142919735

这就是我们布尔量的类型,那是不是这个类型的东西都是布尔量呢?我们之后来看看

类型判断

首先,类型可以推导

image-20241030143126307

我们用 \(\Gamma\) 记录上下文,也就是所有已出现变量的类型

image-20241030143642191

中间这个符号是根据前面的条件推导出后面的结论

image-20241030143730158

image-20241030143842789

这个意思是,如果 “x的类型是 \(\tau\)” 这个判断包含在 \(\Gamma\),那么废话

image-20241030143937220

这个是lambda函数

image-20241030143942810

注意第二个 \(\Gamma\) 之前是空格,\(e_1\) 是函数

上面三个是最基本的推导规则

利用规则推导 true 的类型

注意看每一步都是怎么写出来的,其实很简单,但是要知道怎么写

image-20241030144224847

最后一行的最左边有一点,表示已经没有上下文(前提条件)了,或者说左边的东西都到右边了

也就是说,最后的右边部分是无条件成立的

利用规则推导 false 的类型

有一个问题,\(\lambda x.\lambda x.x\) 就是 false,但是比较难判别

image-20241030144722297

我们可以悄悄地把 \(x\) 改名为 \(x^\prime\)

image-20241030144933811

这下完了,true 和 false 的形式好像不止一种,很蛋疼,我们希望只有一个固定的形式

true 和 false 形式唯一化

很明显,上面的类型不一定就是布尔量,但是我们可以限制,例如其可能可以经过规约后变成布尔量

实际上,只要类型符合上面所述的,经过任意次 \(\beta\) 规约后得到的 normal form 就是布尔量

normal form 是指不能再被替换(\(\beta\) 规约)的表达式,也就是终结符

\(\beta\) 规约前后类型是不会变的

类型规约的规则

image-20241030145834910

normal form

一个 \(e\) 无法再规约就是 normal form,

image-20241030150853280

\(nf\) 即 normal form

image-20241030151202546

箭头右边不用放东西,这两符号放 \(e\) 后面就是标记 \(e\) 还能不能规约,是不是 nf

积类型

积类型就是PP里的复合类型,比如 C 的 enumstruct

二元积

笛卡尔积结果的类型,就一个有序二元组

通过投影进行消去,二选一分量

空积(nullary product)是唯一的无任何值的空元组,类型为 unit

  • 惰性动态语义:⽆论分量是否是值,有序对都是值
  • 急性动态语义:分量都是值时,有序对才是值

有限积

\(n\) 元组

image-20241030151730425

空积与二元积

语法

image-20241030151924763

静态语义

image-20241030151936745

\(\cdot l/r\) 表示左投影/右投影

动态语义

image-20241030151952651

定理10.1:安全性

image-20241030152523388

即,\(e\) 只有两个状态,要么哈可以推,要么推到头了

和类型

空和与二元和

语法

image-20241030153341297

和类型在PL里类似 C 的 enum,里面有很多东西,但用的时候不会同时出现,只能选择其⼀