(我确信这个问题肯定已经在这个网站上得到了回答,但是搜索被 C 中的一个变量调用 free() 的概念所淹没。)
我遇到了“eta减少”一词,它的定义类似于f x = M x ==> M
如果x“在M中不是自由的”。我的意思是,我想我理解它想说的要点,当你将一个函数转换为无点样式时,这似乎是你所做的,但我不知道关于 x 不是免费的限定词是什么意思。
(我确信这个问题肯定已经在这个网站上得到了回答,但是搜索被 C 中的一个变量调用 free() 的概念所淹没。)
我遇到了“eta减少”一词,它的定义类似于f x = M x ==> M
如果x“在M中不是自由的”。我的意思是,我想我理解它想说的要点,当你将一个函数转换为无点样式时,这似乎是你所做的,但我不知道关于 x 不是免费的限定词是什么意思。
这是一个例子:
\f -> f x
在这个 lambda 中,x
是一个自由变量。基本上,自由变量是 lambda 中使用的变量,它不是 lambda 的参数之一(或let
变量)。它来自 lambda 的上下文之外。
Eta 减少意味着我们可以改变:
(\x -> g x) to (g)
但只有x
在g
. 否则,我们将创建一个引用未知变量的表达式:
(\x -> (x+) x) to (x+) ???
好吧,这是相关的 Wikipedia 文章,值得。
简短的版本是这样的定义省略了使用“M”之类的占位符的 lambda 表达式的主体,因此必须另外指定由该 lambda 绑定的变量不用于占位符所代表的任何内容。
因此,这里的“自由变量”粗略地表示在某个模棱两可或未知的外部范围中定义的变量——例如,在类似 的表达式中\y -> x + y
,x
是自由变量但y
不是。
Eta 减少是关于删除多余的绑定层并立即应用一个变量,这(正如您可能想象的那样)仅在所讨论的变量仅用于那个地方时才有效。