Pull to refresh

Comments 26

Каррирование и частичное применение функций очень похожи друг на друга, но концепции это разные.

Потом прочитал главу «О практическом применении концепций каррирования и частичного применения функций» (и далее пост). Понял идею частичного применения. Но зачем нужно каррирование?
Тащемта, да. Каррирование в чистом виде имеет примерно ту же ценность, что и машина Тьюринга: чисто теоретическую.
Синтаксис javascript был основан на java, поэтому каррирование в нем выглядит нелепо. А вот, например, в haskell наоборот: все функции принимают только 1 аргумент, поэтому там каррирование происходит всегда и естественным образом.
Поправка: немного некорректно говорить что что в Haskell каррирование «происходит». Там функции изначально находятся в каррированной форме.
UFO just landed and posted this here
Только там кроме каррирования нужна еще и мемоизация, иначе будет избыточные рендеры. Проще использовать bind в конструкторе.
Именно каррирование, а не частичное применение?
В чем их принципиальное отличие (по крайней мере так утверждается в статье)?
UFO just landed and posted this here
Каррирование означает преобразование функции нескольких аргументов в цепочку функций, принимающих один аргумент. Больше оно ничего не означает.

Не обязательно один. Эти функции тем самым приобретают внутреннее состояние.


В lua например функция ipairs яркий пример каррирования. Она принимает как аргумент массив и возвращает функцию которая при каждом вызове возвращает следующий индекс и значение.


for i,v in ipairs(t) do body end
Каррирование (от англ. currying, иногда — карринг) — преобразование функции от многих аргументов в набор функций, каждая из которых является функцией от одного аргумента.

In mathematics and computer science, currying is the technique of translating the evaluation of a function that takes multiple arguments into evaluating a sequence of functions, each with a single argument.

Действительно ошибочка вышла. Я то думаю почему только один когда в статье вон примеры с несколькими аргументами.

UFO just landed and posted this here
Универсальная функция для частичного применения других функций

простой, но не самый эффективный вариант реализации, когда-то писал свой вариант с бенчмарками относительно других реализаций: https://github.com/Riim/curry#benchmark .

Во-первых, ваш вариант все-таки медленнее. Во-вторых, вы решали немного другую задачу…
Ну я вроде дал ссылку на результаты бенчмарков, в чём-то медленнее, в чём-то быстрее. В чём другая задача? Это вы мне за то, что я поделился своим решением минус влепили? Спасибо, на хабре я уже ничего другого и не жду.

Ну и где у вас в сравнении функция partial? Может, мы разные репозитории смотрим?


То есть вас просто название смутило? Функционал библиотеки является надмножеством функционала приведённого примера и полностью его покрывает, тоже относится к библиотекам в приведённом вами списке. Почему все они используют название curry вместо partial я не знаю, может они все ошиблись, а может это вы что-то не понимаете.
Так я про это и пишу: вы решали не ту же самую задачу, а ее надмножество. И именно по этой причине ваш вариант медленней. И еще именно по этой причине функция partial не попала в ваше сравнение.
вы решали не ту же самую задачу, а ее надмножество

То есть если моя функция решает ту же задачу, что и функция в статье, плюс может делать что-то ещё, то сравнивать эти функции на одинаковых задачах, которые они обе умеют решать по вашему нельзя? Где логика?))


именно по этой причине функция partial не попала в ваше сравнение

Попала, в приведённом списке light-curry примерно настолько же примитивно сделан. Да, сам по себе он быстрее создаёт каррированную функцию, но созданная функция в три раза медленнее такой же, созданной моей библиотекой. Почему то мне кажется, что скорость создаваемой каррированной функции намного важнее, чем скорость её создания, так как она может быть вызвана множество раз (обычно так и случается). Вы так не думаете?

Логика в том, что на тех задачах, которые умеют обе функции, приведенная тут функция partial таки быстрее.


Попала, в приведённом списке light-curry примерно настолько же примитивно сделан.

light-curry использует arguments вместо spread operator, а это известный убийца производительности.

Логика в том, что на тех задачах, которые умеют обе функции, приведенная тут функция partial таки быстрее.

так вы согласны, что функции можно сравнивать?


light-curry использует arguments вместо spread operator, а это известный убийца производительности.

вы думаете если переписать без arguments это что-то сильно поменяет? Хорошо, попробуйте! Предлагайте ваш вариант, который создаёт более быстрые каррированные функции. Будет интересно посмотреть.

вы думаете если переписать без arguments это что-то сильно поменяет? Хорошо, попробуйте!

В обсуждаемой статье приведена оптимальная реализация.

Хорошая статья! Было интересно почитать, спасибо!
Прежде я уже встречал подобные приемы в чужом коде, но не знал, что это называется каррированием. За собой не припомню случаев, чтобы я делал нечто подобное в своем коде.

Однако, сейчас подумал, что этот прием мог бы мне пригодиться в паре моментов, в моем недавнем проекте. Теперь немного жаль…

Я бы назвал эту статью "Каррирование по-русски".

Sign up to leave a comment.