Re[3]: Closure, лямбда, карринг
От: ie Россия http://ziez.blogspot.com/
Дата: 15.09.06 11:52
Оценка:
Здравствуйте, Beam, Вы писали:

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


B>Согласен. Я хотел сделать акцент на ризличиях Closure и Lambda.

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

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

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

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

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

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


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


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

B>Итак.

B>

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


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

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


Вот на этом примере давай остановимся. У тебя
lambda(x) (x + n)

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

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

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


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>Как видно, мы получили другую лямбду. Но является ли это замыканием? Я думаю, да, т.к. связывание с контекстом все таки было.


Является, только замыкание у нас опять появилось в (***), а не в (+++). Еще раз повторю: замыкание ссылается на свободные переменные, а не на значения.

B>Т.е. из определения выше, условие о связывании всех свободных переменных надо убрать?


Если у тебя k не является переменной лексического контекста в котом находится лямбда, то я вообще не уверен, что такой код скомпилируется.

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>


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


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

B>>>Currying:

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

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


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


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

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


B>Итак.

B>

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

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

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


Никакие свободные переменные тут не учавствуют и учавствовать не могут.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.