我正在尝试为玩具语言编写自己的类型推断算法,但我遇到了障碍——我认为算法 W 只能用于过于通用的类型。
以下是表达式:
Expr ::= EAbs String Expr
| EApp Expr Expr
| EVar String
| ELit
| EConc Expr Expr
类型化规则很简单——我们继续使用类型变量进行抽象和应用。以下是所有可能的类型:
Type ::= TVar String
| TFun Type Type
| TMono
正如您可能已经猜到的那样,ELit : TMono
,更具体地说,EConc :: TMono → TMono → TMono
。
我的问题来自于进行实际的类型推断。当递归表达式结构时,看到 an 时的一般技术EAbs
是生成一个新的类型变量来表示新绑定的变量,用(String : TVar fresh)
判断替换我们上下文中出现的任何类型,然后继续向下表达式。
现在,当我点击 时EConc
,我正在考虑采用相同的方法 - 将子表达式的自由表达式变量TMon
替换为上下文,然后对子表达式进行类型推断,并将两个结果的最通用统一符作为主要替代返回。但是,当我使用类似 的表达式尝试此操作时EAbs "x" $ EConc ELit (EVar "x")
,我得到了不正确的TFun (TVar "fresh") TMon
.