Здравствуйте, Beam, Вы писали:
B>А пока я опишу свое понимание.
B>Lambda:
B>- имеет свободны переменные (не определенные в контексте, но используемые внутри функци)
Совсем не обязательно. Лямбда может совсем не иметь свободных переменных:
lambda х, у: х+у
B>- при подстановке свободных переменных возвращает другую лямбду
Что это значит я вообще не понял. Куда подставляются свободные переменные?
Надо проще быть. Я лично для себя определил так: лямбда — это банальная функция, не больше не меньше и есть ли у нее свободные переменные уже не важно.
B>Closure:
B>- при подстановке параметров возвращает обычный результат (не функцию)
Почему функция не может быть обычным результатом?
B>- не имеет свободных переменных, т.е. это "закрытая" лямбда
B>- формируется из лямбды, путем закрытия свободных переменных
Вот это уже ближе.
Действительно, замыкания с лямбдами тесно связаны. Замыкание — это функция которая имеет ссылки на свободные переменные. Заметь, она "закрывается" не значениями (как я думал еще вчера
, привет АВК и Ллойду
), а ссылками на свободные переменные.
B>Currying:
B>- это процесс закрытия свободных переменных в лямбдах
Нет. Карринг — это процесс закрытия связаных переменных.
inc = (1+) -- тут каррировали (почти кастрировали, кстати, почти одно и тоже) функцию + (имеющюю 2 параметра), теперь получили функцию inc с одним параметром.
B>Вопросы:
B>- правильны ли эти краткие определения терминов?
см. выше
B>- какие отличия между closure и обычными (локальными) функциями?
см. выше
B>- делегаты C# 1.0, анонимные методы 2.0 и "лямбды" в 3.0 это вовсе и не лямбды, а closure?
ну смотри:
int y = 10;
Delegate d1 = delegate (int x) { return x * 2; } // лямбда
Delegate d2 = delegate (int x) { return (x + y) * 2; } // лямбда + замыкания
... << RSDN@Home 1.2.0 alpha rev. 0>>