什么是“自由变量”?

时间:2012-01-13 20:49:39

标签: haskell functional-programming lambda-calculus

(我确信这个必须已经在这个网站上得到了解答,但是搜索被C语言中的变量调用free()的概念所淹没。)

我遇到了“eta reduction”这个术语,如果x“在M中不是免费的”,则定义为f x = M x ==> M。我的意思是,我认为我理解它试图说的内容的主旨,看起来就像你将一个函数转换为无点样式时所做的那样,但我不知道关于x的限定符不是自由的意思。

2 个答案:

答案 0 :(得分:27)

以下是一个例子:

\f -> f x

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

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

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

但只有在xg不是免费的(即它没有被使用或是参数)。否则我们将创建一个引用未知变量的表达式:

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

答案 1 :(得分:9)

嗯,here's the relevant Wikipedia article,这是值得的。

简短版本是这样的定义使用像“M”这样的占位符来消除lambda表达式的主体,因此必须另外指定由该lambda绑定的变量不会在占位符表示的任何内容中使用。

因此,这里的“自由变量”大致意味着在一些模糊或未知的外部范围中定义的变量 - 例如,在像\y -> x + y这样的表达式中,x是一个自由变量但是{{1不是。

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