算法W和单态类型强制

时间:2015-05-28 14:54:39

标签: type-inference type-theory type-variables monomorphism

我试图为玩具语言编写自己的类型推理算法,但我碰到了一堵墙 - 我认为算法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-in​​fer子表达式,并将两个结果的最通用的unifier作为返回的主要替换。但是,当我使用EAbs "x" $ EConc ELit (EVar "x")这样的表达式尝试此操作时,我得到了错误的TFun (TVar "fresh") TMon

1 个答案:

答案 0 :(得分:0)

您需要使用mgu来强制使用子表达式。如果直接操作上下文以影响子表达式,则不知道它如何影响早期类型。使用mgu获取将子表达式统一为TMon的替换,然后在结果中组合该替换。