Что такое "свободная переменная"?
(Я уверен, что на это уже должен был быть ответ на этом сайте, но поиск наводняется концепцией вызова 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 связано с удалением лишнего слоя привязки и немедленным применением переменной, которая (как вы, вероятно, представляете) действительна только в том случае, если рассматриваемая переменная используется только в этом одном месте.