我试图了解如何实现类型推断.特别是,我不太清楚"统一"的繁重发挥在何处/为何发挥作用.
我将举一个"伪C#"的例子来帮助澄清:
天真的方式是这样的:
假设您将程序"解析"到表达式树中,以便可以使用以下命令执行:
interface IEnvironment
{
object lookup(string name);
}
interface IExpression
{
// Evaluate this program in this environment
object Evaluate(IEnvironment e);
}
Run Code Online (Sandbox Code Playgroud)
因此,"乘法"之类的东西可以用以下方式实现:
class Multiply : IExpression
{
IExpression lhs;
IExpression rhs;
// etc.
public object Evaluate(IEnvironment e)
{
// assume for the moment C# has polymorphic multiplication
return lhs.Evaluate(e) * rhs.Evaluate(e);
}
}
Run Code Online (Sandbox Code Playgroud)
然后要"实现"类型推断,你可以做类似的事情:
interface ITypeEnvironment
{
Type getType(string name);
}
interface IExpression
{
//as before
object Evaluate(IEnvironment e);
// infer type
Type inferType(ITypeEnvironment typeEnvironment);
} …Run Code Online (Sandbox Code Playgroud)