Re: Closure, лямбда, карринг
От: ie Россия http://ziez.blogspot.com/
Дата: 15.09.06 09:14
Оценка:
Здравствуйте, 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>>
Превратим окружающую нас среду в воскресенье.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.