LINUX.ORG.RU

Ну ты и задал вопрос в 3 часа ночи...

В принципе вопрос взаимосвязан, но есть нюанс. Карринг - это когда ты можешь задать функции от n переменных k входных значений (k < n) и получить ф-цию n-k переменых. Замыкания - это когда ты в конкретном контексте, задаешь некое значение некой переменной (или ченго угодно, ф-ции объекта итд) оно существует при выходе из контекста. Дебильнийший пример - статические переменные.

cathode
()

Интересно, как же ты спутал приём рассмотрения функции многих
переменных как композиции одноаргументных функций и функции,
захватывающие свой лексический контекст.

Sphinx ★★☆☆
()
Ответ на: комментарий от Sphinx

>> захватывающие свой лексический контекст.

в том числе и динамический :)))

cathode
()
Ответ на: комментарий от Sphinx

> приём рассмотрения функции многих переменных как композиции одноаргументных функций

ну блин, так бы сразу и сказали...
кстати. а практическое применение у этой штуки есть? ну кроме как оптимизации кода.

isden ★★★★★
()

Для тех, кто не понял автора, попытаюсь объяснить.

Пусть создаётся замыкание, имеющее тип a -> b -> c и захватывающее переменные x1 и x2. Если в языке программирования запрещены присваивания (или первое выполнение кода замыкания произойдёт тогда, когда x1 и x2 выйдут из области видимости), то замыкание можно представить себе как каррированую функцию имеющую тип x1 -> x2 -> a -> b -> c.

При таком взгляде на ситуацию отличие каррирования от замыканий заключается в том, что если разрешены присваивания, то замыкание может захватить изменяемую переменную и изменять её значение (каррированием такого добиться нельзя, разве что передавать ссылку как аргумент -- но это уже совсем другое).

bvvv
()
Ответ на: комментарий от isden

>кстати. а практическое применение у этой штуки есть? ну кроме как оптимизации кода.

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

Например, есть функция интерпретатора: eval(program,environment)=>result. Если ее каррировать по первому аргументу, то получим: compiled_program(environment)=>result.

Т.е., компиляция - это каррирование функции интерпретации. Аналогичный подход возможен и в некоторых других задачах.

dmitry_vk ★★★
()
Ответ на: комментарий от isden

> а практическое применение у этой штуки есть?

сплошь и рядом. у меня в js ajax на этом работает.

Rastafarra ★★★★
()

Карринг -- сделать так, чтобы вместо функции, принимающей несколько параметров, случилась функция, принимающая один параметр и возвращающая функцию, принимающую второй параметр, возвращающую функцию, принимающую третий...

Замыкание -- (ну, моими словами, не знаю, корректно-ли будет?) привязка некоей переменной одной области видимости (потроха функции) к переменной, находящейся в области видимости над (или под) ней.

Как-то так, поправьте, если не прав.

one_more_hokum ★★★
()
Ответ на: комментарий от dmitry_vk

Давай про проекции Футамуры еще потрындим.

balodja ★★★
()

В том что две разные вещи

Karapuz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.