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

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

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

Да, именно это с самого твоего первого поста и имелось ввиду.

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

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

Еще раз, как только в функции определены свободные переменные, она есть замыкание! Не может быть свободных переменных используемых в функции, если те не определены во внешнем контексте. Или я чего-то не знаю?

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

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

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

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

Угу, а что в таком случае n? Разве не свободная переменная? Безусловно, я этого явно не указал, но полагаю, что где-то во внешнем контексте она определена. Да и вообще у меня в голове не укладывается, что n может быть совсем нигде не определена. Ну тупо не скомпилиться/сыньтерпритируется код.

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>>Является, только замыкание у нас опять появилось в (***), а не в (+++).
B>Не спорю, замыкание появилось в (***). Именно там была создана новая функция. В (+++) всего лишь присваивание. См. чуть ниже

Создана новая функция.... Хмм... А при чем тут создана? Объявлена функция с ссылкой на свободные переменные.

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

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

В примерах используются переменные. Я там значений не увидел.

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


Да, я считаю замыканием не экземпляр функции, а саму функцию, т.е. ее декларацию. А когда я работаю с функцией, которую мне вернули, то меня мало беспокоит замыкание это или нет.


P.S. А вообще тут уже правильно заметили, все определения есть в википедии. Насколько они формальны чудить не мне, но общую картину они дают, а чего же более желать.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[3]: Closure, лямбда, карринг
От: Трурль  
Дата: 18.09.06 06:16
Оценка:
Здравствуйте, Beam, Вы писали:

Т>>Лямбда-выражение – выражение с выделенными переменными-аргументами, обозначающее функцию этих агрументов.


B>а как же возможность обращаться к свободным переменным (не определенных в функции)?

Попиндикулярно.

Т>>Замыкание – структрура данных для представления замкнутого функционального выражения.


B>Структура данных? Я думал, что замыкание — это функция.

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

B>Замкнутое выражение — это что?

Замкнутое выражение — выражение, не содержащее свободных переменных.


B>Ну вот. Карринг — это представление функцмм, или все-таки преобразование? Или и то, и другое.

Тебе что, экзамен сдавать?
Допустим мы придумали функцию, определяющую сумму двух чисел. По смыслу это функция двух агрументов. Но в нашем языке все функции имеют ровно один агрумент. Что делать?
  • Если в языке есть кортежи, можно собрать аргументы в кортеж и получить функцию (x,y) -> x+y. Здесь подошло бы название tupling, но оно уже занято.
  • Если в языке есть функции высшего порядка, можно соорудить функцию x -> (y -> x+y). Вот здесь мы применили currying.
  • Re[4]: Closure, лямбда, карринг
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 18.09.06 23:10
    Оценка:
    Здравствуйте, FR, Вы писали:

    FR>Простая в смысле первоклассная функция, именованная не лямбда. Какая разница когда создается? Главное то что помнит контекст.


    На самом деле контест может быть разным. Вот в D он статический. В Смолтоке... даже не берусь дать точное определение, наверно динамическо-статический. В C#, Nemerle, Scala, OСaml и по умолчанию в Лиспе он лексический, хотя в Лиспе он может быть динамическим.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[5]: Closure, лямбда, карринг
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 18.09.06 23:10
    Оценка:
    Здравствуйте, Beam, Вы писали:

    FR>>Ищи в декларативном программирование, вроде были строгие определения.


    B>Не нашел. Может плохо искал. Поэтому и задал вопрос


    Вот эти определения:
    Re[3]: Closure, лямбда, карринг
    Автор: Programmierer AG
    Дата: 15.09.06

    довольно точные.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[3]: Closure, лямбда, карринг
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 18.09.06 23:10
    Оценка: 1 (1) +1
    Здравствуйте, FR, Вы писали:

    FR>Между замыканиями и обычными функциями тоже различий никаких, любая функция может быть и замыканием.


    Скажу больше. Как это не странно любой экземлярный метод замыкается на экзепляр своего лкасса. И замыкания можно без проблем эмулировать созданием классов. Впрочем как преобразованием функций.

    В общем, ООП и ФП теоритически связаны. Осталось описать эту теорию.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[4]: Closure, лямбда, карринг
    От: Eugene Beschastnov Россия http://eugenius-nsk.livejournal.com/
    Дата: 21.09.06 05:57
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Здравствуйте, FR, Вы писали:


    FR>>Между замыканиями и обычными функциями тоже различий никаких, любая функция может быть и замыканием.


    VD>Скажу больше. Как это не странно любой экземлярный метод замыкается на экзепляр своего лкасса. И замыкания можно без проблем эмулировать созданием классов. Впрочем как преобразованием функций.


    VD>В общем, ООП и ФП теоритически связаны. Осталось описать эту теорию.


    Доказательство примером подойдёт? (часть "Aha! How to get rid of Objects in Smalltalk")
    --
    Бесчастнов Евгений
    Re[5]: Closure, лямбда, карринг
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 21.09.06 15:39
    Оценка:
    Здравствуйте, Eugene Beschastnov, Вы писали:

    EB>Доказательство примером подойдёт? (часть "Aha! How to get rid of Objects in Smalltalk")


    Нет. Доказать примером ничего нельзя. Они могут описывать частный случай.

    Есть вот такое доказательство, но и оно вряд ли потянет на научную теорию. Ну, и там нет СТ.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[6]: Closure, лямбда, карринг
    От: Eugene Beschastnov Россия http://eugenius-nsk.livejournal.com/
    Дата: 21.09.06 16:14
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Здравствуйте, Eugene Beschastnov, Вы писали:


    EB>>Доказательство примером подойдёт? (часть "Aha! How to get rid of Objects in Smalltalk")


    VD>Нет.

    Обрати внимание на смайлик, скучный ты человек.

    VD>Доказать примером ничего нельзя. Они могут описывать частный случай.

    Ну, если занудствовать, то пример вполне может служить доказательством — например, когда утверждается невозможность чего-либо.
    --
    Бесчастнов Евгений
    Re[7]: Closure, лямбда, карринг
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 21.09.06 18:00
    Оценка:
    Здравствуйте, Eugene Beschastnov, Вы писали:

    EB>Ну, если занудствовать, то пример вполне может служить доказательством — например, когда утверждается невозможность чего-либо.


    Если занудствовать, то это называется не доказательством, а опровержением.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[8]: Closure, лямбда, карринг
    От: Eugene Beschastnov Россия http://eugenius-nsk.livejournal.com/
    Дата: 21.09.06 18:56
    Оценка: :)
    Здравствуйте, VladD2, Вы писали:

    VD>Здравствуйте, Eugene Beschastnov, Вы писали:


    EB>>Ну, если занудствовать, то пример вполне может служить доказательством — например, когда утверждается невозможность чего-либо.


    VD>Если занудствовать, то это называется не доказательством, а опровержением.


    Доказательством возможности (или существования)
    --
    Бесчастнов Евгений
    Re[9]: Closure, лямбда, карринг
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 21.09.06 19:04
    Оценка:
    Здравствуйте, Eugene Beschastnov, Вы писали:

    EB>Доказательством возможности (или существования)


    Это уже не пример. А предявление факта.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.