2012-01-13 21 views
20

(Jestem pewien, że na tę stronę już trzeba było odpowiedzieć, ale wyszukiwanie zostaje zalane koncepcją wywoływania free() na zmiennej w C.)Co to jest "zmienna wolna"?

Natknąłem się na termin "redukcja eta", który został zdefiniowany tak, jak f x = M x ==> M, jeśli x jest "nie wolny w M". Chodzi mi o to, myślę, że rozumiem sedno tego, co próbuje powiedzieć, wydaje się, że robisz to, gdy konwertujesz funkcję na styl bezcłowy, ale nie wiem, co oznacza, że ​​kwalifikator na x nie jest wolny.

Odpowiedz

27

Oto przykład:

\f -> f x 

W tym lambda, x jest zmienną wolną. Zasadniczo zmienna wolna jest zmienną używaną w lambda, która nie jest jednym z argumentów lambda (lub zmienną let). Pochodzi spoza kontekstu lambdy.

redukcja Eta oznacza, że ​​możemy zmienić:

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

ale tylko jeśli x nie jest za darmo (to znaczy nie jest używany lub jest argumentem) w g. W przeciwnym razie bylibyśmy tworząc wyrażenie, które odnosi się do nieznanej zmiennej:

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

Drobna nitpick: może być w porządku dla 'x', jeśli jest związana. Eta-redukujące '(\ x -> (\ x -> x + x) x)' do '(\ x -> x + x)' jest całkowicie w porządku, nawet jeśli '(\ x -> x + x)' zawiera dwa zastosowania 'x'. Jest to przypadek narożny, który nie pokaże zbyt wiele w radzeniu sobie z ludzkim kodem, ale wyobrażam sobie, że kompilatory będą częściej się nad tym zastanawiać. – yatima2975

+0

Nadrobiłem tam trochę sformułowania. "Ale tylko jeśli' x' nie jest używane (to znaczy nie jest wolne) "powinno być" Ale tylko wtedy, gdy 'x' nie jest wolny (to znaczy nie jest używany lub jest argumentem)". Oryginalnie napisałem to w ten sposób, ale zmieniłem go w inny sposób, aby było prostsze. Niestety to zmieniło znaczenie :) – porges

9

dobrze, here's the relevant Wikipedia article za to, co to jest warte.

Krótka wersja jest taka, że ​​takie definicje przesuwają treść wyrażenia lambda za pomocą symbolu zastępczego takiego jak "M", a więc muszą dodatkowo określać, że zmienna związana przez tę lambdę nie jest używana w tym, co reprezentuje symbol zastępczy.

Tak, „wolna zmienna” tutaj z grubsza oznacza zmienną zdefiniowaną w jakiś dwuznaczny lub nieznanym zewnętrznej zakresu. - na przykład, w wyrażeniu jak \y -> x + y, x jest zmienną wolną ale y nie jest.

Redukcja ETA polega na usunięciu zbędnej warstwy wiązania i natychmiastowym zastosowaniu zmiennej, która (jak można sobie wyobrazić) jest ważna tylko wtedy, gdy dana zmienna jest używana tylko w tym jednym miejscu.