Re[2]: Closure, лямбда, карринг
От: Beam Россия  
Дата: 15.09.06 11:00
Оценка:
Здравствуйте, ie, Вы писали:

B>>Lambda:

B>>- имеет свободны переменные (не определенные в контексте, но используемые внутри функци)

ie>Совсем не обязательно. Лямбда может совсем не иметь свободных переменных:

ie>
ie>lambda х, у: х+у
ie>


ОК.

B>>- при подстановке свободных переменных возвращает другую лямбду


ie>Что это значит я вообще не понял. Куда подставляются свободные переменные?


Под подстановкой я имею ввиду их связывание с контекстом. Т.е. привязку их к реальным переменным/значениям.

ie>Надо проще быть. Я лично для себя определил так: лямбда — это банальная функция, не больше не меньше и есть ли у нее свободные переменные уже не важно.


Пусть будет так.

Lambda (лямбда) — это функция, которая может иметь свободные переменные (т.е. переменные, используемые в функции, но не являющимися ее параметрами).


lambda (x) (x)                    => lambda, нет свободных переменных
lamda (x, p) (x + p)        => тоже lambda, есть свободные переменные - p


B>>Closure:

B>>- при подстановке параметров возвращает обычный результат (не функцию)

ie>Почему функция не может быть обычным результатом?


Согласен. Я хотел сделать акцент на ризличиях Closure и Lambda.
Ведь обычно лямбды возвращает функцию, а closure — простое значение, не функцию.
Но действительно, это не всегда так.

B>>- не имеет свободных переменных, т.е. это "закрытая" лямбда

B>>- формируется из лямбды, путем закрытия свободных переменных

ie>Вот это уже ближе.


ie>Действительно, замыкания с лямбдами тесно связаны.


Как раз и хотелось четко (однозначно) определить эту связь.

ie>Замыкание — это функция которая имеет ссылки на свободные переменные. Заметь, она "закрывается" не значениями (как я думал еще вчера , привет АВК и Ллойду ), а ссылками на свободные переменные.


Скорее, замыкание имеет привязанные к контексту ссылки (в противопоставление лямбде, где ссылки тоже есть, но они не привязаны).

Итак.

Closure (замыкание) — это лямбда (?), переменные которой связаны с внешним контекстом (т.е. всем (?) ее свободным переменным присвоены конкретные значения/ссылки, определенные вне этой функции).


define makeAdder(n) (                
    lambda(x) (x + n)
)

inc := makeAdder(1)        // closure, в лямбде связали переменную n со значением 1
// получили функцию это равносильную этой:
define inc(x) (x+1)


Будет ли полученная функция замыканием, если не будут привязаны к контексту все свободные переменные.

define makeFunc(n) (                
    lambda(x) (x + n + k)            // n, k - свободные
)

// в лямбде свяжем переменную n со значением 1
func := makeFunc(1)
// получили такую функцию:
define func(x) (x + 1 + k)


Как видно, мы получили другую лямбду. Но является ли это замыканием? Я думаю, да, т.к. связывание с контекстом все таки было.
Т.е. из определения выше, условие о связывании всех свободных переменных надо убрать?

Будет ли полученная функция замыканием, если будет присвоено конкретное значение параметрам функции:

define makeFunc(x) (                
    lambda(x, y) (x + y)
)

// в лямбде свяжем переменную x со значением 1
func := makeFunc(1)
// получили такую функцию:
define func(y) (1 + y)


Это тоже замыкание?

B>>Currying:

B>>- это процесс закрытия свободных переменных в лямбдах

ie>Нет. Карринг — это процесс закрытия связаных переменных.


Не согласен. Тогда уж неважно, какие переменные связывать — свободные или переменные-параметры (связанных).

ie>
ie>inc = (1+) -- тут каррировали (почти кастрировали, кстати, почти одно и тоже) функцию + (имеющюю 2 параметра), теперь получили функцию inc с одним параметром.
ie>


Итак.

Карринг — процесс связывания переменных в лямбдах.

Т.е. карринг — процесс связывание, замыкание — результат

B>>Вопросы:

B>>- правильны ли эти краткие определения терминов?
ie>см. выше

Вы согласны с измененной формулировкой?

B>>- делегаты C# 1.0, анонимные методы 2.0 и "лямбды" в 3.0 это вовсе и не лямбды, а closure?


Если трактовать лямбды, как написано сейчас, тогда да — лямбды

P.S. Вообще-то я хотел поговорить именно о терминологии, т.е. получить/найти определения — лямбда, замыкание, карринг. Т.е. объяснение не на примерах, а именно определение терминов.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Best regards, Буравчик
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.