Там много ответов уже, но я добавлю еще один никому ...
Затворы не являются уникальными для функциональных языков. Например, они встречаются в Паскале (и семье), который имеет вложенные процедуры. Стандарт C их не имеет (пока), но IIRC есть расширение GCC.
Основная проблема заключается в том, что вложенная процедура может ссылаться на переменные, определенные в ее родительском элементе. Кроме того, родитель может вернуть ссылку на вложенную процедуру своему вызывающему.
Вложенная процедура по-прежнему относится к переменным, которые были локальными для родителя - в частности, к значениям, которые эти переменные имели при выполнении строки, выполняющей функцию-ссылку, - хотя эти переменные больше не существуют по мере выхода родительского элемента.
Проблема возникает даже в том случае, если процедура никогда не возвращается от родителя - разные ссылки на вложенную процедуру, построенные в разное время, могут использовать разные прошлые значения тех же переменных.
Резолюция к этому вопросу заключается в том, что при упоминании вложенной функции она упаковывается в «закрытие», содержащее значения переменных, которые необходимы для дальнейшего использования.
Python, лямбда простой пример функциональный стиль ...
def parent() :
a = "hello"
return (lamda : a)
funcref = parent()
print funcref()
Мои питонов немного ржавый, но я думаю, что это правильно. Дело в том, что вложенная функция (лямбда) по-прежнему относится к значению локальной переменной a
, хотя parent
вышла, когда она вызывается. Функция нуждается где-то, чтобы сохранить это значение, пока оно не понадобится, и это место называется закрытием.
Закрытие немного похоже на неявный набор параметров.
Википедия особенно хороша в определениях: http://en.wikipedia.org/wiki/Closure_%28computer_science%29 –
Однако, как Википедия определение это, как правило, пишутся уродцами стресса и кристаллографическими вениками (то есть они не всегда самые простые птицы, чтобы понять). –
Статья в Википедии была той, которую я читал. В нем говорится, что любая функция первого класса со свободными переменными является замыканием. Это не имеет никакого смысла, потому что это включает в себя все функции первого класса, возвращающие значения на основе их аргументов. Это означает, что он становится замыканием, когда функция использует свободные переменные для создания экземпляров связанных переменных? – Amaron