我试图为玩具语言编写自己的类型推理算法,但我碰到了一堵墙 - 我认为算法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
。
我的问题来自于进行实际的类型推断。当递归表达式结构时,看到EAbs
时的一般技术是生成表示新绑定变量的新类型变量,用(String : TVar fresh)
判断替换我们上下文中出现的任何键入,然后继续表达下来。
现在,当我点击EConc
时,我正在考虑采用相同的方法 - 在上下文中用TMon
替换子表达式的自由表达式变量,然后type-infer子表达式,并将两个结果的最通用的unifier作为返回的主要替换。但是,当我使用EAbs "x" $ EConc ELit (EVar "x")
这样的表达式尝试此操作时,我得到了错误的TFun (TVar "fresh") TMon
。
答案 0 :(得分:0)
您需要使用mgu
来强制使用子表达式。如果直接操作上下文以影响子表达式,则不知道它如何影响早期类型。使用mgu
获取将子表达式统一为TMon
的替换,然后在结果中组合该替换。