2012-01-13 160 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減少是關於刪除一個多餘的綁定層,並立即應用一個變量,這是(如你可能想象的那樣)只有在有問題的變量僅用於那個地方時纔有效。