20

(我确信这个问题肯定已经在这个网站上得到了回答,但是搜索被 C 中的一个变量调用 free() 的概念所淹没。)

我遇到了“eta减少”一词,它的定义类似于f x = M x ==> M如果x“在M中不是自由的”。我的意思是,我想我理解它想说的要点,当你将一个函数转换为无点样式时,这似乎是你所做的,但我不知道关于 x 不是免费的限定词是什么意思。

4

2 回答 2

28

这是一个例子:

\f -> f x

在这个 lambda 中,x是一个自由变量。基本上,自由变量是 lambda 中使用的变量,它不是 lambda 的参数之一(或let变量)。它来自 lambda 的上下文之外。

Eta 减少意味着我们可以改变:

(\x -> g x) to (g)

但只有xg. 否则,我们将创建一个引用未知变量的表达式:

(\x -> (x+) x) to (x+) ???
于 2012-01-13T21:00:33.857 回答
9

好吧,这是相关的 Wikipedia 文章,值得。

简短的版本是这样的定义省略了使用“M”之类的占位符的 lambda 表达式的主体,因此必须另外指定由该 lambda 绑定的变量不用于占位符所代表的任何内容。

因此,这里的“自由变量”粗略地表示在某个模棱两可或未知的外部范围中定义的变量——例如,在类似 的表达式中\y -> x + yx是自由变量但y不是。

Eta 减少是关于删除多余的绑定层并立即应用一个变量,这(正如您可能想象的那样)仅在所讨论的变量仅用于那个地方时才有效。

于 2012-01-13T21:03:21.287 回答