Что такое "свободная переменная"?

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

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

2 ответов


вот пример:

\f -> f x

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

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

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

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

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

Ну вот соответствующая статья в Википедии, для чего это стоит.

короткая версия заключается в том, что такие определения выделяют тело лямбда-выражения с помощью заполнителя, такого как "M", и поэтому должны дополнительно указать, что переменная, связанная с этим лямбда, не используется в том, что представляет собой заполнитель.

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

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