JavaScript: currying - каррирование

  Рет қаралды 24,102

PurpleSchool | Anton Larichev

PurpleSchool | Anton Larichev

7 ай бұрын

Посмотрим на currying - каррирование в JavaScript
🍪 Полный курс по JavaScript: purpleschool.ru

Пікірлер: 27
@PostigIT
@PostigIT 7 ай бұрын
Любой метод, алгоритм, функция, библиотека и т.д. нужны для того, чтобы решать какие-то проблемы, задачи. Именно от реальных задач и отталкиваются все, обновляются ЯП, фреймворки, IDE и прочее. Вот вроде понятно, что это такое (каррирование), а для чего оно нужно, не указано. А это самое главное - use cases.
@realfootball338
@realfootball338 7 ай бұрын
ФП на юзкейсах обьяснять очень трудно! И вообще применять на практике. Даже если твой мозг и спроектировал круто код на ФП - не факт что другой который даже любит ФП возьмет и быстро прочитает и внесет модификации без полного или значительного переделывания. Потому и ФП не имеет такого широкого применения как ООП. Но это по прежнему интересно и для в некоторых случаях даже применимо.
@jigglydezar7331
@jigglydezar7331 7 ай бұрын
Это примеры из функционального програмирования, там это важная штука
@user-cl7dj4tj7g
@user-cl7dj4tj7g 5 ай бұрын
@@realfootball338 "не факт что другой который даже любит ФП возьмет и быстро прочитает и внесет модификации" - Нет, наиболее вероятно он поймет твой код лучше(если мы говорим про типизированное ФП), тк банально сигнатура + название функции раскроет ее предназначение. А реализация ее скорее всего будет состоять из уже существующих выражений из-за упора на композицию в фп.
@user-cl7dj4tj7g
@user-cl7dj4tj7g 5 ай бұрын
Ну если мы берем язык без ООП, то с помощью каррирования его можно реализовать, более продвинутые возможности можно посмотреть в хаскеле, где " map (+ 1) " обычное дело.
@ch1cha_gl591
@ch1cha_gl591 7 ай бұрын
Это не карирование, это обычное замыкание, суть карирования в том, чтобы сделать частичное применение для любой функции с помощью обертки над ней, у вас для каждой функции нужно писать кучу кода, а если данных входных будет больше чем два ? В карирование функция обертка будет анализировать сколько данных передано и сколько осталось function sum(a, b, c) { return a + b + c; } function curry(fn) { return function curried(...args) { if (args.length >= fn.length) return fn.apply(this, args); return function (...newArgs) { return curried.apply(this, args.concat(newArgs)); }; }; } const curriedSum = curry(sum); console.log(curriedSum(2, 3, 4)); console.log(curriedSum(2)(3)(4)); Вот пример карирования Или вот такая реализация //Мы карируем функцию sum, после чего она возвращает нам, функцию curried, /*При вызове, карированной функции, у нас есть контекст, в котором видна та функция которую передавали, если при вызове мы передаем в рест оператор недостаточно аргументов, для вызова функции сразу, то мы добавим через bind, аргументы к нашей функции и рекурсивно вызовем карирование, в которую попадет наша новая функция с уже заготовленными аргументами и тут же вернет нам функцию curried, после чего мы сможем опять вызвать эту функцию, и получить контекст уже на функции с добавленным аргументом через bind все это будет происходить до тех пор пока количество передаваемых аргументов в функцию curried, будет меньше чем количество оставшихся свободных аргументов функции fn, как только это будет не так, вызовется функция fn с теми аргументами которые уже есть (при вызове мы их не указываем, потому что они уже находятся там), и теми которые мы передали в последний раз */ const curry3 = (fn, ...par) => { const curried = (...args) => fn.length > args.length ? curry3(fn.bind(null, ...args)) : fn(...args); return par.length ? curried(...par) : curried; }; function sum3(a, b, c) { return a + b + c; }
@user-cl7dj4tj7g
@user-cl7dj4tj7g 5 ай бұрын
"Это не карирование, это обычное замыкание" - Это все равно что сказать "Это не автомобильно, это красное". С помощью замыкания каррирование и работает, тк оно замыкает значение переменной в результате возвращаемой функции. "функции нужно писать кучу кода, а если данных входных будет больше чем два " - Ну так минусы отсутствия поддержки каррирования в жс. Прихоидтся так костылять. Ну и писать функцию которая делает другие функции каррироваными, такое себе дело. Лучше уж юзать полноценные фп либы, где код написан идиоматично(fp-ts, effect-ts).
@kapusha228
@kapusha228 7 ай бұрын
Это разве не обычное замыкание?
@user-me6vb7gw9c
@user-me6vb7gw9c 7 ай бұрын
а зачем это надо не рассказал, можно было реальные примеры привести где это необходимо
@youareweak9211
@youareweak9211 7 ай бұрын
Это очень узкая тема, редко встречается, но всё же бывает
@thats_embarrassing_JS
@thats_embarrassing_JS 7 ай бұрын
Каррирование(и не только) используется в декларативном программировании, чтобы разбить императивный код на мелкие вспомогательные функции, сделать код более читабельным и переиспользуемым. Чаще всего, подобные вещи используются в проектах, когда необходимо обработать большие объёмы данных и как-либо их трансформировать.
@thats_embarrassing_JS
@thats_embarrassing_JS 7 ай бұрын
Можете посмотреть на такие библиотеки, как lodash, ramda или @tinkoff/utils. Там много функций используют каррирование.
@tacituskilgore2258
@tacituskilgore2258 7 ай бұрын
@@thats_embarrassing_JSа ты хорош, Леви)
@wakeup2k_
@wakeup2k_ 7 ай бұрын
⁠​⁠@@thats_embarrassing_JSточно ПЕРЕИСПОЛЬЗУЕМЫМ 😅😅
@varanakonda
@varanakonda 6 ай бұрын
Зачем? В реальной жизни не применяется в подавляющем большинству случаев.
@rykit
@rykit 7 ай бұрын
А зачем это надо
@daveyjonesx
@daveyjonesx 7 ай бұрын
На собесе могут спросить, а так незачем
@uszakow
@uszakow 7 ай бұрын
Если хочешь чтобы коллега сломал мозг пытаясь прочитать твой код, то очень рекомендую. Главное не ограничиваться 2мя функциями, а писать что-то типа fn(1,2)(3)(4,5)([6,7],8). Такой код гарантированно никто не поймет, а значит ты становишься ценным незаменимым сотрудником в фирме, которого нельзя уволить ;)
@user-cl7dj4tj7g
@user-cl7dj4tj7g 5 ай бұрын
@@uszakow Я правильно понимаю, что разработчик на жс, сломается от вызова fn(...)(...)(...)(...)? Просто если да, то с разработчиком, что-то не так, тк это не самая сложная синт. конструкция в жс.
@uszakow
@uszakow 5 ай бұрын
@@user-cl7dj4tj7g а на кой такая конструкция нужна? Да, существует ПАРА случаев практического использования конструкции fn(...)(...). Видел такое при использовании Redux в функции connect и при написании styled components. Зачем кому-то использовать больше 2х вызовов функции подряд? Или использовать даже 2 вызова, но не в тех паре-тройке мест, где это принято? Искусство ради искусства? Попытка сделать код менее читаемым? Добавить "авторский стиль"? В любом случае вне зависимости от мотивации такой код не должен проходить ревью. Разве что автор докажет, что именно такое решение решает некую задачу - скажем, существенно повышает производительность, ради чего можно пожертвовать читаемостью. Сомневаюсь, что такое доказательство будет предоставлено.
@user-cl7dj4tj7g
@user-cl7dj4tj7g 5 ай бұрын
​"а на кой такая конструкция нужна?" - Ну как минимум для реализации функторов, если мы говорим про ТС. "Зачем кому-то использовать больше 2х вызовов функции подряд? " - Ну по памяти я редко такие функции видел, но обычно такое для чего-то на подобии билдера используют. "Или использовать даже 2 вызова, но не в тех паре-тройке мест, где это принято?" - Ну в основном так функции никто не вызывает, обычно это нужно для будущей композиции функций. Ну и в целом, функции с более чем двумя аргументами редкость, и стараются так не писать.
@mikokz2329
@mikokz2329 7 ай бұрын
То есть это один из подвидов замыкания?
@realfootball338
@realfootball338 7 ай бұрын
Срамыкания!
@user-dh6dd3ky9z
@user-dh6dd3ky9z 6 ай бұрын
И что? Таких видосов полно .... Для чего нужно каррирование, просьба пояснить. Конкатенировать таким способом в реальной жизни не нужно будет никогда!
@user-cl7dj4tj7g
@user-cl7dj4tj7g 5 ай бұрын
Ну вообще лучше всего посмотреть на fp-ts и то как он применяется, многое можно подчеркнуть оттуда
@user-tb2jf7km2m
@user-tb2jf7km2m 5 ай бұрын
А зачем самого себя путать?
@FobosWorld
@FobosWorld 5 ай бұрын
Обожаю эти бесполезные концепции или механизмы языка уоторые 99 процентов девов не встретят никогда)
Задача из Собеседования на 160,000 Евро в Год
13:27
Саша Лукин
Рет қаралды 1,1 МЛН
PINK STEERING STEERING CAR
00:31
Levsob
Рет қаралды 22 МЛН
Sprinting with More and More Money
00:29
MrBeast
Рет қаралды 187 МЛН
Why You Should Always Help Others ❤️
00:40
Alan Chikin Chow
Рет қаралды 131 МЛН
World’s Deadliest Obstacle Course!
28:25
MrBeast
Рет қаралды 110 МЛН
7  ПАРАДОКСОВ БЕСКОНЕЧНОСТИ
36:02
Mathin
Рет қаралды 453 М.
Каррирование в JavaScript
16:14
Веб-разработка - DevMagazine
Рет қаралды 8 М.
Interview of a Junior Frontend developer. Trainee frontender 19 years old from EPAM
1:16:43
Front-end Science із Сергієм Пузанковим
Рет қаралды 405 М.
PINK STEERING STEERING CAR
00:31
Levsob
Рет қаралды 22 МЛН