“Algorithm W 是 Hindley–Milner 系统的语法导向类型推断算法。输入类型环境 $\Gamma$ 与项 $t$,成功时返回替换 $S$ 和单态类型 $\tau$,满足 $…”
形式陈述 ​
环境通常记为
扩展
因此扩展会遮蔽
直觉 ​
环境把“这个名字在这里代表什么”从语法之外的默契变成显式对象。源代码里可以在不同嵌套层重复使用同一个名字,求值器只要沿当前环境查找,就能找到最近且未被遮蔽的绑定。这种表示也让作用域切换成为普通数据操作:进入 let 或函数体时扩展环境,离开时恢复原环境,而不是在整段程序文本中替换名字。
词法作用域的关键是环境由定义位置决定。函数体中的自由变量应沿函数定义时保存的环境解析;调用点只提供实参与新的局部绑定。当前调用栈可以帮助实现环境,但二者不是同一概念:栈记录动态控制过程,词法环境表达静态嵌套所确定的名字关系。
例子与边界 ​
考虑 let x = 1 in let x = 2 in x + 3。求值外层绑定后得到 x + 3 在
环境与 store 的区别在可变变量处最清楚。若 x := 2 更新的是
类型环境
推论与应用 ​
操作语义可用判断式
实际实现可以把环境做成父指针链、持久映射、栈帧或编译后的词法地址。只要查找、遮蔽和作用域恢复的可观察行为一致,这些表示都实现同一语义角色;环境裁剪还可只保留后续确实会访问的自由变量绑定。
参考资料
- Michael R. Clarkson et al., OCaml Programming: Correct + Efficient + Beautiful, Cornell CS 3110 textbook,the environment model and lexical scope。
- Benjamin C. Pierce, Types and Programming Languages, MIT Press, 2002,Chs. 9–11 and 22,evaluation and typing contexts。