2012-01-13 109 views
20

(我确定这个网站上已经有这个答案了,但是搜索被C中的一个变量调用free()的概念所淹没。)我遇到了“eta还原”这个术语,如果x是“M中不空闲”,则定义为f x = M x ==> M。我的意思是,我认为我理解它要说的内容的要点,看起来就像你将一个函数转换为无点风格时所做的一样,但我不知道x是不是免费的限定词意味着什么。什么是“自由变量”?

回答

27

下面是一个例子:

\f -> f x 

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

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

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

但是,只有当x不是免费的(即,它不使用或是一个参数)中g。否则,我们就可以创造它是指一个未知变量的表达式:

(\x -> (x+) x) to (x+) ??? 
+2

Minor nitpick:如果绑定了'x',可以使用。尽管'(\ x - > x + x)'减少了'(\ x - >(\ x-> x + x)x)'到'(\ x - > x + x)包含'x'的两个用法。这是一个角落案例,在处理人工编写的代码时不会显示太多内容,但我想编译器会更频繁地运行它。 – yatima2975 2012-01-14 15:51:08

+0

我搞砸了那里的措辞。 “但是,只有当'x'没有被使用(即不是空闲的)”时,“应该是”但是只有当'x'不是空闲的(即它没有被使用或者是一个参数)“。我原本是这样写的,但改变了它,使其更简单。不幸的是,改变了意义:) – porges 2012-01-14 23:13:27

9

好,here's the relevant Wikipedia article,什么是值得。

简短的说法是,这样的定义使用像“M”这样的占位符消除了lambda表达式的主体,因此必须额外指定该lambda绑定的变量没有在占位符表示的任何地方使用。

所以,一个“自由变量”在这里是指大致在一些模糊的或未知的外范围内定义的变量 - e.g,在像\y -> x + y一个表达式,x是自由变量但y不是。

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