J C*_*per 20 haskell functional-programming lambda-calculus
(我确信这个必须已经在这个网站上得到了解答,但搜索被C语言中的变量调用free()的概念所淹没.)
我遇到了"eta reduction"这个术语,它被定义为f x = M x ==> M如果x"不是M中的自由".我的意思是,我认为我理解它试图说的内容的主旨,看起来就像你将一个函数转换为无点样式时所做的那样,但我不知道关于x的限定符不是自由的意思.
por*_*ges 28
这是一个例子:
\f -> f x
Run Code Online (Sandbox Code Playgroud)
在这个lambda中,x是一个自由变量.基本上,自由变量是lambda中使用的变量,它不是lambda参数(或let变量)之一.它来自lambda的上下文之外.
减少意味着我们可以改变:
(\x -> g x) to (g)
Run Code Online (Sandbox Code Playgroud)
但是,只有x不是免费的(即它没有被使用或是一个参数)g.否则我们将创建一个引用未知变量的表达式:
(\x -> (x+) x) to (x+) ???
Run Code Online (Sandbox Code Playgroud)
嗯,这是相关的维基百科文章,这是值得的.
简短的版本是这样的定义使用像"M"这样的占位符来消除lambda表达式的主体,因此必须另外指定由lambda绑定的变量不用于占位符表示的任何内容.
因此,这里的"自由变量"大致意味着在一些模糊或未知的外部范围中定义的变量 - 例如,在表达式中\y -> x + y,x是一个自由变量但y不是.
Eta减少是关于删除多余的绑定层并立即应用变量,这是(正如您可能想象的)只有在相关变量仅用于该位置时才有效.