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

ie>Давай лучше так. И лямбды и замыкания всегда возвращают результат (отсутствие результата, как обычно, будем считать результатом), а что является этим результатом, функция или значение, суть дела не меняет.


ОК.

ie>замыкание ::= (лямбда + ссылки на свободные переменные) — так пойдет ?


Что такое ссылки на свободные переменные? Если имеется ввиду ссылки на переменные, определенные во внешнем контексте, то да, согласен.
Если нет — тогда что?

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


ie>Не согласен. См. ниже


Может я не понят. Я имею ввиду, что в лямбде описаны свободные переменные (внешние), но их значения не определены. А вот в замыкания они имеют конкретные значения/ссылки, т.е. привязаны к контексту.

ie>Вот на этом примере давай остановимся. У тебя

ie>
ie>lambda(x) (x + n)
ie>

ie>является лямбдой, но не является замыканием. Почему?

Не является замыканием, потому что не имеет ни одной переменной, привязанной к внешнему контексту. Его вообще здесь нет

ie>
ie>define makeAdder() (
ie>        n := 1
ie>    l := lambda(x) (x + n)
ie>        l(3)
ie>)
ie>

ie>Вот в этом примере является замыканием?

Да. Сделана привязка переменной n (она реально существует). В данном случае контекст — makeAdder.

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


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

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


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


ie>Является, только замыкание у нас опять появилось в (***), а не в (+++).


Не спорю, замыкание появилось в (***). Именно там была создана новая функция. В (+++) всего лишь присваивание. См. чуть ниже

ie>Еще раз повторю: замыкание ссылается на свободные переменные, а не на значения.


И с этим я не спорю. Просто в примерах используются значения.

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


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

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


ie>Я выделил замыкание.


Не понял. Похоже ты называешь замыканием описание лямбды, расположенной в каком либо контексте, а я — называю замыканием конкретную функцию, которая существует в программе (ну как объект) и создается динамически. Я понятно разницу объяснил?

B>>>>Currying:

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

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


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


ie>Ссылки на свободные мы получаем благодаря замыканию и карринг тут не причем.


ОК. см. ниже

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


B>>Итак.

B>>

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

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

ie>Нет. Не согласен.

ie>Карринг — создание новой функции путем задания значений одному или более агрументу:
ie>
ie>f n p = ... -- тут был тип функции  a -> a -> a
ie>g     = f 1 -- тут получили с типом a -> a
ie>


ie>Никакие свободные переменные тут не учавствуют и учавствовать не могут.


Начал писать пример, почему это неправда. И пришел к выводу, что ты прав
Карринг относится только к параметрам функции и уменьшает количество опять же параметров, но никак не свободных (внешних) переменных.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Best regards, Буравчик
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.