(我确信这个必须已经在这个网站上得到了解答,但是搜索被C语言中的变量调用free()的概念所淹没。)
我遇到了“eta reduction”这个术语,如果x“在M中不是免费的”,则定义为f x = M x ==> M
。我的意思是,我认为我理解它试图说的内容的主旨,看起来就像你将一个函数转换为无点样式时所做的那样,但我不知道关于x的限定符不是自由的意思。
答案 0 :(得分:27)
以下是一个例子:
\f -> f x
在这个lambda中,x
是一个自由变量。基本上,自由变量是lambda中使用的变量,它不是lambda参数之一(或let
变量)。它来自lambda的背景之外。
Eta减少意味着我们可以改变:
(\x -> g x) to (g)
但只有在x
中g
不是免费的(即它没有被使用或是参数)。否则我们将创建一个引用未知变量的表达式:
(\x -> (x+) x) to (x+) ???
答案 1 :(得分:9)
嗯,here's the relevant Wikipedia article,这是值得的。
简短版本是这样的定义使用像“M”这样的占位符来消除lambda表达式的主体,因此必须另外指定由该lambda绑定的变量不会在占位符表示的任何内容中使用。
因此,这里的“自由变量”大致意味着在一些模糊或未知的外部范围中定义的变量 - 例如,在像\y -> x + y
这样的表达式中,x
是一个自由变量但是{{1不是。
Eta减少是关于删除多余的绑定层并立即应用一个变量,这个变量(正如您可能想象的那样)只有在相关变量仅用于那个地方时才有效。