2012-01-13 6 views
20

(Я уверен, что на этом, должно быть, уже был дан ответ на этом сайте, но поиск наводнен концепцией вызова free() для переменной в C.)Что такое «свободная переменная»?

Я натолкнулся на термин «сокращение эта», который был определен как f x = M x ==> M, если x «не является свободным в M». Я имею в виду, я думаю, что я понимаю суть того, что он пытается сказать, похоже, что вы делаете, когда вы конвертируете функцию в бесшумный стиль, но я не знаю, что означает, что спецификатор о x не свободен.

ответ

27

Вот пример:

\f -> f x 

В этом лямбда x является свободной переменной. В принципе, свободная переменная - это переменная, используемая в лямбда, которая не является одним из аргументов лямбда (или переменной let). Это происходит вне контекста лямбды.

снижение Eta означает, что мы можем изменить:

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

Но только если x не свободна (т.е. он не используется или аргумент) в g. В противном случае мы бы создать выражение, которое относится к неизвестной переменной:

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

Незначительный nitpick: это может быть хорошо для 'x', если оно связано. Eta-reduce '(\ x -> (\ x -> x + x) x)' to '(\ x -> x + x)' отлично, даже если '(\ x -> x + x)' содержит два использования 'x'. Это угловой случай, который не проявится в работе с человеко-письменным кодом, но я думаю, что компиляторы будут чаще сталкиваться с этим. – yatima2975

+0

Я немного испортил формулировку. «Но только если' x' не используется (т. Е. Не является бесплатным) »должно быть« Но только если 'x' не является бесплатным (т. Е. Не используется или является аргументом)». Я изначально написал это так, но изменил его другим способом, чтобы сделать его более простым. К сожалению, это изменило смысл :) – porges

9

Ну, here's the relevant Wikipedia article, для чего это стоит.

Короткий вариант заключается в том, что такие определения высвечивают тело выражения лямбда с использованием заполнителя, такого как «М», и поэтому должны дополнительно указать, что переменная, связанная с этим лямбдой, не используется в том, что представляет собой заполнитель.

Таким образом, «свободная переменная» здесь примерно означает переменную, определенную в некоторой неоднозначной или неизвестной внешней области -. Например, в выражении типа \y -> x + y, x является свободной переменной, но y нет.

Eta reduction - это удаление лишнего слоя привязки и немедленное применение переменной, которая, как вы могли бы себе представить, действительна только в том случае, если рассматриваемая переменная используется только в одном месте.

Смежные вопросы