Что такое «свободная переменная»? - PullRequest
20 голосов
/ 14 января 2012

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

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

Ответы [ 2 ]

27 голосов
/ 14 января 2012

Вот пример:

\f -> f x

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

(\x -> (x+) x) to (x+) ???
9 голосов
/ 14 января 2012

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

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

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

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

...