0

我正在尝试为玩具语言编写自己的类型推断算法,但我遇到了障碍——我认为算法 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.

4

1 回答 1

0

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

于 2015-05-28T16:19:48.360 回答