Types 纯lambda表达式(let free表达式)是否需要重命名?

Types 纯lambda表达式(let free表达式)是否需要重命名?,types,lambda,ml,inference,principal,Types,Lambda,Ml,Inference,Principal,纯lambda表达式是否需要重命名? 在ML中,输入程序表达式必须具有每个绑定变量都是不同的属性。我想知道纯lambda表达式(let free expressions)是否也一样?当您有绑定器时,唯一重要的是变量引用与其绑定器之间的关系。使用名称只是表示这种关系的一种方便方式(但您可以使用其他技术,如指针、显式连接(如交互网络中的连接)、De Bruijn索引等) 如果使用名称,当两个嵌套活页夹使用相同的名称时,可能会发生冲突。在这种情况下,您需要一些策略来区分它们,所有编程语言中的典型解决方

纯lambda表达式是否需要重命名?
在ML中,输入程序表达式必须具有每个绑定变量都是不同的属性。我想知道纯lambda表达式(let free expressions)是否也一样?

当您有绑定器时,唯一重要的是变量引用与其绑定器之间的关系。使用名称只是表示这种关系的一种方便方式(但您可以使用其他技术,如指针、显式连接(如交互网络中的连接)、De Bruijn索引等)

如果使用名称,当两个嵌套活页夹使用相同的名称时,可能会发生冲突。在这种情况下,您需要一些策略来区分它们,所有编程语言中的典型解决方案是,变量与最内层的绑定器关联,该绑定器具有相同的名称,其范围覆盖了变量

在实践中,变量重命名仅在(手动)减少术语期间相关,因为您需要避免变量捕获现象。 例如,考虑“< /P>”这个词。
                          (\x.\y.x y) y
最外层的y是自由的。 通过beta约化,这是(\y.x y)[y/x],如果我们天真地执行替换,我们会得到术语(\y.y)。这是错误的,因为参数变量y在进入其作用域时被同名绑定器秘密捕获

在这种情况下,我们需要在执行缩减之前重命名变量,例如

                          (\x.\z.x z) y
在还原之后,这将为我们提供新的正确结果\z.y z


当然,在类型化设置中,由不同标识符绑定的变量具有不同的类型,因此重命名它们以避免混淆可能是一种很好的做法

ML没有这样的属性:
(fn a=>fn a=>a+1)“foo”1
。你能解释一下你的例子吗?当问题很广泛且没有明确说明时,很难解释一些东西。问题是关于类型推断的算法。核心ML是lambda演算+let。我想知道如果我们从ML中删除“let”,是否需要在类型推断算法中重命名有界变量?