Haskell与ML的微妙关系:从类型翻译到抽象机实现
1. SL/LL到IL的类型与术语翻译
1.1 类型翻译
为了模拟值和表达式上下文的区别,使用三种不同的类型翻译:$D_b \langle t \rangle$、$D_v \langle t \rangle$ 和 $D_k \langle t \rangle$。
- $D_v \langle t \rangle$:堆上值的类型(以及变量绑定的类型)。
- $D_k \langle t \rangle$:接收类型为 $t$ 的表达式求值结果的延续类型。
- $D_b \langle t \rangle$:“裸”类型,尚未通过适当的否定转换为值或延续类型。
SL和LL仅支持匿名和积类型,没有声明新数据类型的规定。LL的类型系统不足以表示许多Haskell数据类型,例如Haskell的 Bool
类型与IL的 $(1 \vee 1)$ 同构,而LL的等价类型 $1 \oplus 1$ 映射到IL类型 $(\neg\neg 1 \vee \neg\neg 1)$。
函数的表示很有趣,逻辑蕴含 $P \Rightarrow Q$ 经典等价于 $\neg P \vee Q$,但在直觉主义演算中不能作为函数类型。类型 $\neg(P \& \neg Q)$ 经典等价于蕴含,其操作解释是函数是一个接收两个值(类型为 $P$ 的参数和类型为 $\neg Q$ 的结果发送位置)的延续,这与实际抽象机中的函数调用工作方式一致。
1.2 术语翻译
SL/LL术语到IL术语的翻译如下表所示:
| SL/LL