Что не так с каррированием на JavaScript?

  Рет қаралды 33,688

S0ER

S0ER

3 жыл бұрын

#soer #itubeteam
Основной канал для общения и публикации новых видео - Телегарм - t.me/softwareengineervlog
Спонсорство - donate.s0er.ru
Сайт платным контентом - soer.pro
Зеркало для видео Дзен Видео - zen.yandex.ru/id/5f578bdf22e2...
GitHub - github.com/soerdev
Чат для программистов - / discord
Группа ВК - codeartblog

Пікірлер: 233
@HeroRc
@HeroRc 3 жыл бұрын
Почувствовал себя снова в универе. Подробнейшая теория какой-то странной функции без каких-либо объяснений для чего это вообще нужно. Пишу на JS уже 8 лет, ни разу вообще не слышал про каррирование. Зашел узнать, что это. Узнал. Но зачем узнал не узнал.
@user-tg1je2vj1c
@user-tg1je2vj1c 2 жыл бұрын
Если ты не писал в функциональной парадигме, то это нормально
@anatolyvatson2542
@anatolyvatson2542 Жыл бұрын
Автор покрайней мере обьяснил откуда ноги растут- из других языков, где под капотом транслятор приводит функции с несколькими аргументами к унарным
@pavelnenashev4353
@pavelnenashev4353 9 ай бұрын
что и .bind не использовал?
@rustavellyne
@rustavellyne 7 ай бұрын
@@anatolyvatson2542 а зачем делать так?
@user-ue8bh7tj5k
@user-ue8bh7tj5k 3 ай бұрын
Почти аналогично. Даже не представляю, где теоретически в том же фронтенде может понадобится каррирование.
@Kira-iv1io
@Kira-iv1io 3 жыл бұрын
Олдфаги: - Ваше каррирование чистая фальшь сударь! Любой JS Ньюфаг: - Это фишка языка, у нас такого добра много **Звуки уезжающего в закат гироскутера**
@scaymetonn6041
@scaymetonn6041 3 жыл бұрын
Хахах)
@user-vu6hn4ul2i
@user-vu6hn4ul2i 3 жыл бұрын
Вот такой пердимонокль.
@user-zn9je9ek8k
@user-zn9je9ek8k 3 жыл бұрын
"Важно понимать как правильно, но отвечать как ожидают" - мудро)))
@unknyver
@unknyver 3 жыл бұрын
Идея с рукописным вводом с планшета понравилась, возможно стоит попробовать чуть более затенить правую часть экрана и сделать шрифт белым. Спасибо за контент!)
@scaymetonn6041
@scaymetonn6041 3 жыл бұрын
Шрифт идеальный, пусть оставляет так как есть
@S0ERDEVS
@S0ERDEVS 3 жыл бұрын
Да, надо поиграться. Тоже не очень нравится как выглядит.
@scaymetonn6041
@scaymetonn6041 3 жыл бұрын
@@S0ERDEVS мне очень даже нравится, сомневаюсь что получится лучше
@fazleev
@fazleev 3 жыл бұрын
@SOER , нормально выглядит
@Galano-vx7xy
@Galano-vx7xy 3 жыл бұрын
@@S0ERDEVS Классно выглядит!!Цвет шрифта топ!!
@OlegGoritsyn
@OlegGoritsyn 3 жыл бұрын
Не понятно зачем оно нужно, но очень интересно. Спасибо :-)
@DART2WADER
@DART2WADER 3 жыл бұрын
Я также не понимаю. Сам хотел это написать. Дичь какая-то. Какие-то извращения.
@nekosora6036
@nekosora6036 3 жыл бұрын
Что именно? Каррирование или частичное применение?
@TheProfessionalGambler
@TheProfessionalGambler 3 жыл бұрын
Частичным применением можно закрепить какой-то аргумент. Например есть функция умножения mult(x,y), закрепляем x = 2 получаем функцию удвоения double(y).
@pavelsolovyenko1975
@pavelsolovyenko1975 3 жыл бұрын
Согласен. интересно узнать в чем предпосылка создания каррирования в функциональных языках. Возможно оптимизация параллельного выполнения конечно.
@nekosora6036
@nekosora6036 3 жыл бұрын
@@pavelsolovyenko1975 функциональное программирование базируется на лямбда-исчислении. В нём есть функции только от одного аргумента. Чтобы эмулировать функцию от n аргументов, нужно делать функцию, которая принимает один аргумент и выдаёт функцию от n - 1 аргументов. Проще говоря, эта операция лежит в основе фп. Поэтому она также естественна как и сложение в арифметике
@Albert_Hall
@Albert_Hall Жыл бұрын
Услышал о каррировании, попытался что-то найти, включил данный видос и не понял о чем вообще речь :) *так как не был осведомлен о бэкграунде данного вопроса. Закрыл видос и пообещал вернуться сильнее :))). И вот пару дней спустя я возвращаюсь и понимаю смысл и уместность каждой высказанной автором фразы !). обещание сдержал) ухожу с чистой совестью). П.С. Хотя нет, надо вернуться еще разок еще сильнее :)) с умением влёгкую составлять примеры и отличать слёту друг от друга Каррирование и Частичное Применение Функций 🎳💡
@hjetwd
@hjetwd 3 жыл бұрын
Текст голубой с тенью конечно хорош, но, думаю, белый с тенью, был бы лучше. По поводу подачи материала - сложно. Сложно тому, кто 1 раз слышит о каком-то каррировании (а видео, как я понял, для таких людей и предназначено). Я бы шел от простого к сложному - это как ребенку объяснять алфавит. Из деревянных кубиков строим дом. Каждый кубик - буква алфавита, а дом - слово. Из одних и тех же букв можно собрать разные слова, как и разные дома можно построить из одних и тех же кубиков. Дети вы все поняли? Дааа! .... Соер: Итак, представьте что буквы - это стройматериалы для постройки дома, а дом - это слово. Теперь рассчитаем кубатуру железобетона и сечение арматуры для монолитных конструкций. ..... Ученики: ЧТООО??? Да ну нахер, пойду в проститутки! =)))))))))))
@censored2279
@censored2279 3 жыл бұрын
Тут не вопрос что сложно, вопрос зачем это нужно? Почему именно какой то из вариантов луше/хуже, или просто они разные но решают одну проблему.
@scaymetonn6041
@scaymetonn6041 3 жыл бұрын
Отличный формат, очень наглядно
@BahtiyarBasharov
@BahtiyarBasharov 3 жыл бұрын
Интересный материал. Обьясняет доходчиво. Проще мне кажется не передать. Тема с планшетом вообще огонь!
@user-rz1bn3gl7q
@user-rz1bn3gl7q 3 жыл бұрын
Ничего не понял, но крайне интересно, кажись потом придется пересматривать еще раз
@yarik256
@yarik256 3 жыл бұрын
Спасибо за отличное объяснение!
@volga_code
@volga_code 2 жыл бұрын
спасибо, наконец-то понял ) а то читал перевод стать о каррировании на hubr ничего не понятно было )
@andreekzz
@andreekzz 3 жыл бұрын
Крутое видео. Спасибо
@andreychiglintcew5024
@andreychiglintcew5024 3 жыл бұрын
Спасибо за подачу, узнал много нового, пойду разбираться с карированием в TS, до этого видео не знал что такое вообще существует.
@SiberianAndy
@SiberianAndy 3 жыл бұрын
Формат видео очень крутой! Тема тоже интересная, хотелось бы немного практических примеров. Я сам знаю только один пример, чтобы в реакте в обработчике события вместо (e) => func(e) можно было бы писать просто func, а сама функция уже возвращала бы другую с эвентом. Но и то этот пример скорее визуально делает код может быть более красивым, но с унарными вычислениями ничего общего не имеет. Так зачем нам каррирование в JS?)
@ensox
@ensox 3 жыл бұрын
Есть же варианты каррирования с использованием .valueOf, они будут отрабатывать корректнее, с учетом того что они определяют нужно ли сейчас вернуть функцию или результат ее выполнения. Как пример: var add = function (orig) { var inner = function (val) { return add(parseInt(val+'', 10) == val ? orig+val : orig); }; inner.valueOf = function () {return orig;}; return inner; };
@adskfksefn
@adskfksefn 3 жыл бұрын
Ничерта не понял, но оочень интересно
@olezhonnv3215
@olezhonnv3215 3 жыл бұрын
Многие пишут в коментах, что ничего не понял, или зачем это нужно. А вот Я - ПОНЯЛ! Я и раньше знал о частичном применении. Но никогда сам так не писал, не было смысла. Может пригодится когда-то - посмотрим.
@Denis.Zhelnerovich
@Denis.Zhelnerovich 3 жыл бұрын
@ S0ER Так вроде можно легко написать такую функцию каррирования, которая разложит функцию любой арности на унарные, без всяких curryN или eval: ``` const curry = original => { const _curry = (length, args) => length ? arg => _curry(length - 1, [...args, arg]) : original(...args) return _curry(original.length, []) } const original = (x, y, z) => x + y + z const curried = curry(original) console.log(curried(1)(2)) // function arg => ... console.log(curried(1)(2)(3)) // 6 console.log(curried(1)(2, 'anything')(3)) // 6 ``` Проблема только в потере имени параметров функции, но если использовать TypeScript то хотя бы типы удастся сохранить
@S0ERDEVS
@S0ERDEVS 3 жыл бұрын
это частичное применение с фиксированным количеством аргументов. Такой подход ведет себя более похоже на каррирование, но не является им.
@Epic0n
@Epic0n 3 жыл бұрын
Такой вариант каррирования не подойдет? const curry = (fn) => { const arity = fn.length; const cFn = (...args) => (x) => { const iArgs = [...args, x]; return iArgs.length === arity ? fn(...iArgs) : cFn(...iArgs); }; return cFn(); };
@akifjevda
@akifjevda 3 жыл бұрын
Подскажите модель планшета-рисовалки. Я так понимаю, это не просто планшет, а он еще и показывает что на нем написано.
@S0ERDEVS
@S0ERDEVS 3 жыл бұрын
XP-Pen 15.6
@atlasua2021
@atlasua2021 2 жыл бұрын
Ааа дошло, это типо такая же бесполезная фигня, как в математике умножение бесконечностей?
@andor1904
@andor1904 3 жыл бұрын
Мне кажется, стоило ещё в конце добавить варианты реального применения карирования и частичного применения
@user-sc9it9zd4g
@user-sc9it9zd4g 2 жыл бұрын
В императивных языках это бесполезно чуть менее, чем полностью, разве что жуниоров на интервью валить. А в функциональных языках это настолько естественно, что многие даже не замечают, что используют.
@Oswee
@Oswee 3 жыл бұрын
Horoshaja podacha i interesno, no ja vsjo tak i ne ponjal zachem mnje eto v praktike. Gde mnje eto stoit ispolzovatj (krome interview)?
@isopp7744
@isopp7744 3 жыл бұрын
S0ER, где я не смогу сделать декомпозицию, и мне прям вот никак - и нужно применить вот это всё?
@yrurunning651
@yrurunning651 3 жыл бұрын
На самом деле не вижу причины использовать утилити-функции из библиотек (например ramda.js) для имитации каррирования, когда можно просто вручную записать const f = x => y => z => x + y + z. Благодаря стрелкам можно по-настоящему каррировать функции без библиотек и кучи return
@yrurunning651
@yrurunning651 3 жыл бұрын
P.S. материал хороший, однозначно лайк и подписка) Каналы по разработке редко уделяют такое внимание теории
@fluttermaster6148
@fluttermaster6148 3 жыл бұрын
Для тех кто не совсем понял про partial application (частичное задание), вот простой пример: svelte.dev/repl/fb866fc4de4840a29a166ea8f6cfff0d?version=3.29.0 без partial application svelte.dev/repl/992057054d6546dc99a397d4d6155238?version=3.29.0 с partial application
@artma5
@artma5 3 жыл бұрын
Скажите, пожалуйста, что такое унарная функция и чёрточка около обычного названия функции?
@user-ku2er1ds3v
@user-ku2er1ds3v 3 жыл бұрын
Функция от одного аргумента. Ничего не значит. Это когда хочешь называть функцию одинакова, но хочешь показать, что это уже другая функция.
@garorobe
@garorobe 3 жыл бұрын
@@user-ku2er1ds3v Много чего значит. Значит что ты говоришь на одном языке с остальным миром. Вещи вроде арности или что такое предикат выглядят глупым сахаром до тех пор пока не сталкиваешься с математическими корнями программирования и тем, что если ты всё-таки хочешь доказывать формальную корректность кода придётся стать математиком.
@slavaviktorov6053
@slavaviktorov6053 3 жыл бұрын
это все понятия из математики, включая штрих(черточку) в названии.
@MbwiruEikura
@MbwiruEikura 3 жыл бұрын
За 9+ лет разработки пока так и не довелось использовать и встретить в коде коллег ни каррирование, ни частичное применение на практике. Каковы типичные юзкейсы? Какая-то инициализация?
@qq77777
@qq77777 3 жыл бұрын
Типичный юзкейс - это усложнение архитектуры, когда у тебя есть a, b, c и ты такой пытаешься выпендриться перед коллегами какой ты прошаренный и в зависимости от аргумента "с" генеришь функцию либо a+b либо а - b. Если серьезно то применение этому есть, допустим у тебя есть код на Frontend и ты хочешь скрыть детали реализации каких либо вещей при нажатии на кнопку к тебе с сервера приходит функция либо набор функций, соответственно при получении на клиент - вызываешь ее.
@PavelKoryagin
@PavelKoryagin 3 жыл бұрын
@@qq77777 Если мне с сервера приходит набор функций, то я должен ОЧЕНЬ сильно доверять этому серверу. Но это ладно, где только тут каррирование? Если сервер отдаёт фронтенду функцию, то где та сила, которая заставит их сделать все эти функции арности строго 1 и никак иначе?
@user-id7vd8jq1b
@user-id7vd8jq1b Ай бұрын
Да все это хрень собачья)
@nikolaysokolov9027
@nikolaysokolov9027 3 жыл бұрын
Отличная метафора о немножко беременна! Рукописный ввод с планшета отлично выглядит. Спасибо!
@olegivanov6163
@olegivanov6163 3 жыл бұрын
Спасибо Вам, S0ER, за разъяснение! Теперь я наконец-то знаю, что один из частных методов, которые мне приходится использовать по мере предметной необходимости, наделён "сообществом" отдельным "именем собственным", вокруг которого даже создаётся кодинг-идеологический ажиотаж. Забавно. В любом случае - за разъяснение - спасибо!
@artur1998g
@artur1998g 3 жыл бұрын
В питоне есть функция functools.partial, которая позволяет частично передать аргументы в функцию. И ты можешь еще раз применить partial к функции, если надо. Это очень удобно, например, когда у тебя в коде несколько раз вызывается функция с одними и теми же аргументами, кроме одного. Как я понял, это и есть "частичное применение", только в питоне это явно, нежели как показано в js. А вот карирование в каких ситуациях применяется, я предположить немогу... Ну или может с карированием, как с метаклассами в питоне. "Если вы думаете применить карирование или нет, вам оно не нужно"
@user-ey5xw2nx9s
@user-ey5xw2nx9s 3 жыл бұрын
Хмм в Javascript есть Function.bind(obj, args...), если я Вас правильно понял
@eugenefomenko4001
@eugenefomenko4001 3 жыл бұрын
Чем плох такой подход, если задача каррирования просто собрать аргументы? Вроде сразу генерируем вложенные функции (не в момент выполнения). function carry(fn) { const args = []; const generateFunc = (argsCount) => { return (arg) => { args.push(arg); if (argsCount > 1) { return generateFunc(argsCount - 1); } return fn(...args); }; }; return generateFunc(fn.length); } const sum = (a, b, c) => a + b + c; const carriedSum = carry(sum); carriedSum(1)(2)(2); // 5
@georgybunin8054
@georgybunin8054 3 жыл бұрын
"Важно понимать как правильно, но отвечать так как ожидают". Вообще с этим не согласен. Зачем порождать невежество. Ведь при ответе на этот вопрос можно начать с того, что "Для упрощения примем частичное применение функции за каррирование". Или так "в виду особенностей js решим данную задачу каррирования через частичные применения функции". Можно даже с такой ремарки начать свое решение: "Для имплементации сигнатуры каррирования применим рекурсивный вызов для всех аргументов функции". Мне кажется это даст тому кто собеседует понимание владения материалом, а не просто как обезьянка заучить решения задач типа: fn(x)(y)(z) Или реализуйте свой promise Или другую подобную дичь которую любят спрашивать на собеседованиях.
@johnykallisto6488
@johnykallisto6488 3 жыл бұрын
По звуку сразу видно клавиатура с синим свитчами, попробуй brown свитчи
@vladyslavhalchyshak1176
@vladyslavhalchyshak1176 3 жыл бұрын
с какой целью используется каррирование? Где это применяется на практике?
@vladyslavhalchyshak1176
@vladyslavhalchyshak1176 3 жыл бұрын
@Психолог Лариса Бандура конечно зря, удаляйте)
@user-lc1ph5jg5k
@user-lc1ph5jg5k 3 жыл бұрын
давление сообщества...
@karelalex
@karelalex 3 жыл бұрын
Чё-т не понял прикола в JS в принципе относится к количеству аргументов свободно. Так что каррирование по честному, возможно, сделать и не очень-то и получится. В этом смысле чем так уж плохо каррирование методом частичного применения не очень понятно.
@a1ex_sk
@a1ex_sk 3 жыл бұрын
От задачи зависит. Иногда действительно нужно честное каррирование, иногда это просто желание (вполне разумное и обоснованное) следовать принципам и идиологии принятой в конкретном проекте. Но вот чего не понимаю, в чем проблема на js сделать честное автокаррирование? Да, это будет псевдо-рекурсия, но фактически никакой рекурсии там конечно нет, как и нет никаких проблем, обычно связываемых с рекурсией. Пример, созданный за три минуты без претензии на production ready jsbin.com/xanuboveca/edit?js,console
@RezetRoy
@RezetRoy 3 жыл бұрын
@@a1ex_sk можно пример реальной задачи?
@sergeys4732
@sergeys4732 3 жыл бұрын
Просьба, писать белым цветом, а не синим, ничего же не видно
@belonit48
@belonit48 3 жыл бұрын
Можно ли назвать настоящие карирование частным случаем частичного применения ?
@krikuff
@krikuff 3 жыл бұрын
Нет, это концептуально разные вещи. Операция каррирования меняет функцию. Берет исходную функцию A и возвращает другую функцию B. Частичное применение же -- это вызов функции B на количестве параметров меньшем, чем есть у функции A. Другое дело, что ЖС слегка подменяет и склеивает эти понятия. Но делает это чертовски хорошо для изначально нефункционального языка
@S0ERDEVS
@S0ERDEVS 3 жыл бұрын
Нет, даже использовать частичное применение для эмуляции каррирования - это неправильно, просто в JS по-другому не сделаешь.
@krikuff
@krikuff 3 жыл бұрын
@@S0ERDEVS Методологически да, но кому хочется писать кучу скобок-то? Красота по мне в том, что можно в одних скобках частично применить несколько аргументов, а потом в других еще несколько. При этом такое поведение достигается не магией интерпретатора, а посредством языка (что в целом для интерпретируемых ЯП не удивительно)
@w999d
@w999d 3 жыл бұрын
@@S0ERDEVS лол, и вообще писать код - это неправильно, надо чтобы оно просто работало изначально
@user-li7sm7ux2q
@user-li7sm7ux2q 3 жыл бұрын
Кто то конкретно офигел, если спрашивает про это у джунов.
@phat80
@phat80 3 жыл бұрын
А что надо спрашивать у джунов? Что такое переменная? ))) Если знает, уже хорошо?
@danildemchenko6004
@danildemchenko6004 2 жыл бұрын
@@phat80 прототипы, промисы, асинхронщину, замыкание. Мало чтоли тем нормальных и интересных?
@vlad80212
@vlad80212 3 жыл бұрын
Что мешает использовать функцию с замыканием и позволять ввод лишь одного параметра за каждый вызов новой функции. И если функция уже имеет все параметры то поледущие её вызовы просто бы возвращали закешированый результат?
@pavel-orlov
@pavel-orlov 3 жыл бұрын
Что-то у меня сложилось впечатление, что кое-кто неверно передал задачу, которая бывала на собеседованиях и теперь это пошло-поехало по ютубу как испорченный телефон ) Когда просили реализовать каррирование, то указывали, что нужно написать функцию каррирования для заданного фиксированного числа аргументов. А по поводу частичного применения уже были вопросы в дальнейшем как раз с учетом приведенных в видео отличий. Понятно, что каррирование - частный случай частичного применения. И, кстати, это не противоречит определению, приведенному на learn.javascript: "Каррирование - это трансформация функций таким образом, чтобы они принимали аргументы не как f(a, b, c), а как f(a)(b)(c). Каррирование не вызывает функцию. Оно просто трансформирует её."
@S0ERDEVS
@S0ERDEVS 3 жыл бұрын
Каррирование - это не частный случай частичного применения, в этом и подвох. См. объяснение, например, тут - stackoverflow.com/questions/218025/what-is-the-difference-between-currying-and-partial-application/23438430#23438430
@pavel-orlov
@pavel-orlov 3 жыл бұрын
@@S0ERDEVS Не вижу там опровержения. Просто пояснение, что это разные понятия на типовом примере. Который в видео ты сам и рассказал. И никакого подвоха)
@S0ERDEVS
@S0ERDEVS 3 жыл бұрын
@Pavel Orlov просто говорить, что каррирование - частный случай частичного применения - неверно, следует из определения. Чего тут опровергать?
@pavel-orlov
@pavel-orlov 3 жыл бұрын
@@S0ERDEVS По-моему, это уже называется "доебаться". )) Примерно как было раньше в видосах про сокрытие в ООП. Ни одной ссылки на саму терминологию каррирования и частичного применения в каких-либо более-менее достоверных источниках никто никогда не приводит, потому что их, по сути, нет. Нет строгой терминологии - нет противоречий.
@krikuff
@krikuff 3 жыл бұрын
@@pavel-orlov Ты не сможешь частично применить некаррированную функцию, поэтому каррирование -- не частный случай частичного применения. Все равно что говорить, что приготовление салата -- частный случай его поедания. Перед частичным применением функция каррируется в рантайме или в компайлтайме как ни крути. Функциональный чед выше привел более-менее достоверный источник термина каррирование -- вики хаскеля ( wiki.haskell.org/Currying )
@k0dzer0
@k0dzer0 3 жыл бұрын
Не очень интересно - "почему", больше всего интересно "для чего и в каких ситуациях", тогда и стимул появится, разобрать даже в 10 раз сложнее систему, была бы надобность. Очень сложно представить, где это пригодится в формочках сайта или других задачах. Чем массив или объект данных, виде одного входного значения хуже, чем все его значения переданные, как отдельные аргументы, не понятно.
@isopp7744
@isopp7744 3 жыл бұрын
Не парься, друг, это они себе просто так повышение зп выпрашивают... По поводу пригодится, ну наверное речь пойдёт не о вебе, наверное для разработки библиотек и тп.
@k0dzer0
@k0dzer0 3 жыл бұрын
Ну если ЗП то ладно, главное, что бы не самооценку))), а-ля как Басков, какой я красивый и умный)). Очень слабо вериться, что такое может пригодится в библиотеках JS, иногда в код заглядывал, но такой белебирды там не встречал, потому что как правило сложность алгоритмов в простоте их решения, когда их уже видишь. Если предположим алгоритм Дейкстры понятно, что это такое и для чего, то это просто был какой-то вариант решения и выглядит мягко говоря, как понты, а не как эффективное решение, которое потом будет легко прочесть другим, чтобы понять с ходу, ну или как вариант, я что-то не понял, такое тоже часто бывает, не исключаю, но тогда лишь только потому, что недоступно объяснили.
@isopp7744
@isopp7744 3 жыл бұрын
@@k0dzer0 Да, полностью согласен, какой в этом смысл если это усложняет сопровождение кода, почему нельзя обойтись декомпозицией, что мы выиграем, если применим вот это всё.
@yrurunning651
@yrurunning651 3 жыл бұрын
Честно говоря, чистый функциональный стиль редко используется в больших проектах. Для маленьких в нем тоже нет особого смысла, т.к. лучше подходят стандартные решения. Но в целом функциональное направление (отдельные элементы) очень сильно повлияло на разработку в целом. Практически во всех популярных языках уже есть лямбда, map, filter, иммутабельные переменные. Редакс (снаружи) - исключительно функциональное программирование, реакт тоже двигается в этом направлении (однако там ещё далеко для настоящего фп). P.S. просьба не кидать в меня помидоры, я знаю, что один лишь map - это не функциональное программирование. Однако я об этом и говорю, что отдельные практики фп перетекают в другие языки и позволяют создавать удобные решения.
@slavaviktorov6053
@slavaviktorov6053 3 жыл бұрын
@@isopp7744 Вы тут все пишите из джуниорской вселенной, но каждый бьет в себя в грудь о 9000лет опыта программирования. Но даже не можете понять что вам показывают в видео) Деструктуризация? Чтобы было проще, пример немного не верный но все же, есть метод bind. Вот этот метод также позволяет делать частичное применение fn.bind(null, arg1). Вот такую "белебирду" придумали умники ради повышения зп, а могли "декомпозировать" наверное)
@AlexYaroshevich
@AlexYaroshevich 3 жыл бұрын
То, что в джава скрипте для создания функций нужен эвал звучало как заблуждение. Можно догадаться о чем шла речь, но без разъяснения это скорее введение слушателя в заблуждение. Если в функцию curry добавить цикл и по f.length, то все будет нормально работать без эвала
@S0ERDEVS
@S0ERDEVS 3 жыл бұрын
Это будет частичное применение. Чтобы было карирование функция должна возвращать не частично примененную функцию, а композицию вложенных функций от одной переменной, количество функций должно быть равно арности каррируемой функции. Грубо говоря, то что вы внешне получаете поведение похожее на каррирование не означает что вы каррировали функцию. Так же как китайская подделк айфона не является айфоном, хотя внешне очень похожа.
@AlexYaroshevich
@AlexYaroshevich 3 жыл бұрын
@@S0ERDEVS Как будто я с этим спорил))) Я лишь просил, чтобы не вводили в заблуждение слушателей) Но дело ваше
@user-bh4gy5lx7u
@user-bh4gy5lx7u 2 жыл бұрын
Это похоже на каррирование? function sum(a) { const current = (b) => sum(a + b) current.toNum = () => a return current } console.log(sum(4)(-6)(-1)(5)(-5)(10)(14).toNum()) // 21
@mrThomasTeller
@mrThomasTeller 3 жыл бұрын
Не понимаю, почему ты утверждаешь, что в js нельзя сделать настоящее каррирование? В чём проблема вот этой реализации? Никакого евала: function carry(fn, _length = fn.length) { return (x) => _length fn(x, ...args), _length - 1); } const f = carry((a, b, c) => a + b + c); console.log(f(1)(2)(3)); // 6 console.log(f(1)(2, 3)(4)); // 7
@S0ERDEVS
@S0ERDEVS 3 жыл бұрын
В том что это частичное применение.
@mrThomasTeller
@mrThomasTeller 3 жыл бұрын
@@S0ERDEVS ты говорил, что частичное применение отличается от каррирования тем, что в случае каррирования игнорируются все аргументы кроме первого. Так вот в моём примере берётся только первый аргумент. Так что не могу понять, почему это всё ещё не каррирование...
@S0ERDEVS
@S0ERDEVS 3 жыл бұрын
@Артем Бахарев, потому что каррирование - это композиция из функций вложенных друг в друга, число функций зависит от арности каррируемой функции. Т.е. f(a,b,c) должно преобразоваться в curry(f) => (a) => (b) => (c) => f(a,b,c) у тебя же преобразуется в curry(f) => partial(x) разницы не замечаешь? P.S. Я твою анонимную функцию представил как partial
@MrTylerRus
@MrTylerRus 3 жыл бұрын
@@S0ERDEVS а в чем ключевая разница между «правильным» каррированием и частичным запоминающим только первый аргумент? Правильное: F(1)(2)(3, 8) => 6 Частичное запоминающое только первый аргумент F(1)(2)(3, 8) => 6
@S0ERDEVS
@S0ERDEVS 3 жыл бұрын
@Дмитрий Приданников во внутренней структуре, так можно сказать, что, скажем, между строкой и массивом строк нет разницы: "123"[1] // "2" ["1", "2", "3"][1] // "2"
@user-qw9wf6fw6b
@user-qw9wf6fw6b 3 жыл бұрын
Короче это какая-то черная магия. Я звоню в полицию
@chikenmacnugget
@chikenmacnugget 3 жыл бұрын
топ аниме коврик
@NecroRomnt
@NecroRomnt 3 жыл бұрын
Бессмысленный комментарий ради продвижения канала. vim что бы выйти и сохранить можно использовать :x
@OlegGoritsyn
@OlegGoritsyn 3 жыл бұрын
А чтоб не сохранять? :-)
@NecroRomnt
@NecroRomnt 3 жыл бұрын
@@OlegGoritsyn так на видео :wq, я ради комментария под видео выдал бессмысленное предложение использовать :x. Человек пользующийся этой программой может для себя решить что ему использовать :w, :q!, :q, :x, :sh
@S0ERDEVS
@S0ERDEVS 3 жыл бұрын
Это да, но старую собаку новым трюкам не обучишь ) Привычка.
@distributedsystemsfanboy5208
@distributedsystemsfanboy5208 3 жыл бұрын
Бессмысленный ответ на бессмысленный комментарий для продвижения канала. :x не обновит mtime при выходе, если буфер не менялся. кому-то может быть важно.
@NecroRomnt
@NecroRomnt 3 жыл бұрын
@@distributedsystemsfanboy5208 , не знал, спасибо!
@user-lz1yb6qk3f
@user-lz1yb6qk3f 3 жыл бұрын
А если я положу все аргументы в одну структуру, это будет являться каррированием?
@nekosora6036
@nekosora6036 3 жыл бұрын
Нет
@user-lz1yb6qk3f
@user-lz1yb6qk3f 3 жыл бұрын
@@nekosora6036, но я же приведу функцию к одному элементу. В чём разница?
@nekosora6036
@nekosora6036 3 жыл бұрын
@@user-lz1yb6qk3f это просто другое преобразование.
@zORg_alex
@zORg_alex 3 жыл бұрын
Я Сишарпер, и у меня только один вапрос: На У Я?
@nanvlad
@nanvlad 3 жыл бұрын
вернешься к этому видео, когда захочешь изучить F#
@zORg_alex
@zORg_alex 3 жыл бұрын
@@nanvlad а оно мне нужно? Посмотрел, и на сишарпе такую фигню сделать можно лямбдами. Вот только зачем? На английском сорсе упомянули какие-то продвинутое вычисления с какой-то древовидностью. Но хз где это применять. В общем если кто и спросит про курирование, скажу, что такими извращениями не занимаюсь. 😅
@nanvlad
@nanvlad 3 жыл бұрын
@@zORg_alex как говорится в одном известном меме: "Кто не понял - тот поймёт". Значит ещё не пришло то время, когда оно понадобится
@user-fe1dd4bd8f
@user-fe1dd4bd8f 3 жыл бұрын
Ну затем, зачем в принципе нужны функции высших порядков. Ты можешь написать дженеричную функцию, частично применить её передать в аргумент третей функции.
@user-cq3hr5op5q
@user-cq3hr5op5q 3 жыл бұрын
Насколько я понял, это программирование ради программирования. Как олимпиадные задачи. Ты можешь неплохо в них разбирать но быть бесполезным при решение практических задач. Знать это можно, но не обязательно.
@master.joda987
@master.joda987 3 жыл бұрын
что не так с JavaScript'om?
@davidfromnorth7836
@davidfromnorth7836 3 жыл бұрын
Он просто другой
@ilnurryazhapov9377
@ilnurryazhapov9377 3 жыл бұрын
Все норм)
@jurafree426
@jurafree426 6 ай бұрын
const curry = a_fn => (...args) => { if (a_fn.length > args.length) { const new_fn = a_fn.bind(null, ...args); return curry(new_fn); } else { return a_fn(...args) } }
@andriichornyi9143
@andriichornyi9143 3 жыл бұрын
Постарайтесь объяснять всё на "обычном языке": язык формул и терминов скрывает смысл. Ценность Ваших видео обратно пропорциональна плотности терминов и формул в нём. А можно сказать что чем меньше будет формул и терминов в Ваших видео тем в Ваших видео больше ценности. Расжовуйте пожалуйста лучше.
@qaz261
@qaz261 3 жыл бұрын
Надо вставать и уходить с собеседования, где спрашивают нечто подобное "как сделать на языке Х, что-то такое, что никогда не пригодится по работе?". Сделать можно что угодно на чём угодно. Но если это не будет применятся ни где, кроме собеседования, то это знание/умений - глупо.
@CyrilViXP
@CyrilViXP 3 жыл бұрын
Вот это такую херню на России на собеседованиях спрашивают?
@eugeneponomarov7429
@eugeneponomarov7429 3 жыл бұрын
Неужели это "каррирование" настолько важно что насчёт этого вопроса идёт холивар?
@zmeygavrilych
@zmeygavrilych 3 жыл бұрын
Скорее всего холивар идёт насчёт вопроса важно оно, или нет )
@S0ERDEVS
@S0ERDEVS 3 жыл бұрын
Примерно так же важно как машина Тьюринга. Это один из столпов, гарантирующих верность работы программ в функциональных языках.
@DART2WADER
@DART2WADER 3 жыл бұрын
@@S0ERDEVS UB
@PutlerXLO
@PutlerXLO 3 жыл бұрын
Эх, упустили мы момент, когда можно было отловить и зарубить на корню малочисленных любителей притащить свой haskell и прочую муть в JS... слышишь "лямбда"- стреляй на звук :)))
@Epic0n
@Epic0n 3 жыл бұрын
Вам лишь бы стрелять...
@a1ex_sk
@a1ex_sk 3 жыл бұрын
При всем уважении, автор втирает какую то дичь про то, что в js нельзя реализовать нормальное каррирование? Или я что то не так понял? Типа либо статически создаём сразу все вложенные функции, либо делаем хрень с частичным каррированием. А, что мешает сделать нормальное каррирование с динамическим созданием функций? JS без проблем это позволяет, у меня минуты три ушло... jsbin.com/xanuboveca/edit?js,console
@S0ERDEVS
@S0ERDEVS 3 жыл бұрын
Это частичное применение.
@a1ex_sk
@a1ex_sk 3 жыл бұрын
@@S0ERDEVS чейта? Каждая функция применяет ровно один параметр вне зависимости от того, как её вызвали. Для получения результата необходимо ровно столько вложенных вызовов, сколько параметров у исходной функции. В каком месте оно частичное?
@S0ERDEVS
@S0ERDEVS 3 жыл бұрын
@Александр Соколов, каррирование превращает функцию в набор функций, у тебя нет набора функций, у тебя есть функция, которая при вызове частично применяет один параметр и возвращает другую функцию, которая опять частично применяет один параметр. То что ты ограничил частичное применение одним параметром, не изменило сути вещей. Каррирование - это не способ вызова функций, а способ их преобразования в набор функций. Если подумаешь, то увидишь, что частичное применение у тебя на вложении больше двух возвращает не функцию, а "функцию | число", зависит от условия length, а каррирование возвращает на всех шагах кроме последнего строго функцию (да еще с одной переменной), а не последнем шаге строго число. Приведу другой пример: "123"[1] // "2" ["1", "2", "3"][1] // "2" То что поведение одинаково (в обоих случаях возвращается "2") не делает строку массивом строк, а массив строк строкой. Ну или проще "форма != содержанию", у тебя совпадение только по форме. по содержанию есть существенные различия.
@a1ex_sk
@a1ex_sk 3 жыл бұрын
@@S0ERDEVS не согласен: 1. Каррирование возвращает не набор функций, а одну функцию с одним аргументом, которая возвращает следующую функцию с одним аргументом, которая возвращает функцию с одним аргументом...и т.д., пока не будут собраны все аргументы. Последняя вернёт результат. В какой момент создаются сами функции никак не влияет ни на поведение, ни на использование, ни на результат. 2. Если так уж принципиально, то все вложенные функции можно создать сразу при каррировании. Это вообще ничего не изменит. Вы же врадли особо переживаете, во что превращается ваш код после компиляции или как он видоизменяется оптимизатором, по крайней мере пока оно не аффектит поведение? 3. Семантически, string в js реализует интерфейс массива символов. Так же как, например, Array реализует интерфейсы массива, очереди и стека. Если вам нужен интерфейс массива символов, то разницы нет ни какой, заверните вы это в [] или в обычную строчку. Если вам важна семантика, оба варианта ей прекрасно соотвнтствуют В видео вы делали акцент на разнице в поведении. Я привёл тривиалтный пример кода, когда разницы нет. Теперь вы говорите, что разница в том, когда именно создаётся функция. Я могу потратить еще 5 минут и дать вам код, в котором сразу вся цепочка будет создаваться сразу. Но вас ведь и это не устроит? Определите чётко, как в энциклопедии, понятия каррирования, частичного каррирования, требований к реализации и пр., так что бы не было разночтений. Я попробую предоставить код, который полностью соответвует вашим требованиям... Только постарайтесь описать так, что бы не появлялись пост-требования, и не было противоречий с синтаксисом JSа
@fantast2568
@fantast2568 Жыл бұрын
@@S0ERDEVS Привет, а это частичное применение или каррирование? const curry = (fn, ...par) => { const curried = (...args) => ( fn.length > args.length ? curry(fn.bind(null, ...args)) : fn(...args) ); return par.length ? curried(...par) : curried; }
@user-rr7yr9ml9p
@user-rr7yr9ml9p 2 жыл бұрын
слишком сложно о довольно простой штуке
@OB-el5ih
@OB-el5ih 3 жыл бұрын
синий цвет шрифта шрифт на планшете плохо на фоне видно
@zmeygavrilych
@zmeygavrilych 3 жыл бұрын
Что не так с SOER? Зачем долго и нудно объяснять что-то, не объяснив сначала, зачем оно вообще нужно?
@S0ERDEVS
@S0ERDEVS 3 жыл бұрын
Что оно?
@garorobe
@garorobe 3 жыл бұрын
Потому что простого способа объяснить парадигмальные вещи не существует. Либо читать теорию до просветления, либо долбить практику до него же. Это как с ООП. Можно рассказать про классы и наследование, но это ничем не поможет тому, кто не понимает саму парадигму. "Знать и понимать"
@zmeygavrilych
@zmeygavrilych 3 жыл бұрын
​@@garorobe Нет ничего проще, чем объяснить ООП. К тому же, вопрос "зачем оно вообще нужно" - это не про объяснение "парадигмальных вещей", а про элементарное применение на практике.
@zmeygavrilych
@zmeygavrilych 3 жыл бұрын
@@S0ERDEVS То, о чём видео.
@S0ERDEVS
@S0ERDEVS 3 жыл бұрын
@VG, видишь, ты даже не можешь дать определение своего "оно", а хочешь чтобы я понял зачем "оно" тебе нужно. Но в любом случае я не знаю нужно "оно" тебе или нет, не помогу с этим вопросом.
@demimurych1
@demimurych1 Жыл бұрын
Автор не разбирается в том, что пытается обьяснить. В следствии чего, в процессе сравнения теплого с цистерной, не только умудряется придумать какие-то проблемы у функциональщиков, но и придумать _оригинальное_ определение тому что такое теплое, а что такое цистерна. Судите сами: *Начнем с простого. С частичного применения. Или почему автор сравнивает теплое с цистерной* В случае же языка JavaScript все из ниже перечисленного будет являться примером частичного применения: var doThing = ( (a, b, c) => {} ); var doThingA = doThing.bind( null, theA ); // частичное применение одного аргумента var doThingAB = doThing.bind( null, theA, theB ); // частичное применение двух аргументов doThingAB = doThing.bind( null, theA ).doThing.bind( null, theB ); // два частичных применения последовательно. или var doUnaryThing = ( (a) => (b) => (c) => {} ); var doUnaryAB = doUnaryThing(theA)(theB); То есть частичное применение не характеризуется количеством аргументов функции, способом ее вызова или количеством аргументов при вызове. Частичное применение - это любая возможность языка программирования, которая позволяет с любым количеством из множества аргументов предопределенной функции, связать значения и вернуть новую функцию, логика которой позволит связать значения со свободными аргументами оригинального множества и последующим применением всего множества к оригинальной функции. *А теперь что такое Каррирование* С академической точки зрения, каррирование это форма синтаксиса лямбда исчесления, которая позволяет представить лямбда терм зависящий от более чем одного аргумента, как последовательное применение(апликации) необходимого количества термов от одного аргумента. Сейчас станет понятнее. Лямбда исчисление, это язык программирования возникший в 30 годах 20 века, как математический аппарат, который позволял эффективно оперировать абстракциями. Оригинальная версия языка не позволяла иметь абстракцию от более чем одного аргумента: λx.x Тем не менее потребность в таких абстракциях была. Потому, поскольку было очевидным что любую абстракцию от N аргументов можно представить в виде N термов от одного аргумента, и чтобы не ломать красивый сложившийся аппарат, Хаскель Карри предложил расширить нотацию до λx.λy.x что и было в последствии названо каррированием. В последствии, в программировании сложился неудачный жаргон, когда функцию, которая позволяет принять на вход другую функцию, и привести ее к виду последовательного вызова функций от одного аргумента так же стали называть каррированием. Что не до конца верно, но тем не менее отражает суть. *ИГОГО* Каррирование - это в оригинале форма нотации в лямбда исчислении, которая в силу своей схожести по сути, обрело место в жаргоне у программистов, как процесс приведения функции от N+1 аргументов к N+1 функций от одного аргумента, которые должны быть последовательно вызваны Частичное применение - это процесс формирование новой функции на основании старой, но уже с меньшим кол-вом аргументов. По этой причине, последовательный вызов функций, от одного аргумента - это ровно тоже самое частичное применение. Каррирование - это способ нотации, позволяющий функцию от N аргументов представить как N функций от 1 аргумента. А частичное применение - это процесс выполнения таких конструкций. Иными словами, любое каррирование как нотация, будет использозвать частичное применение как процесс, но не каждое частичное применение работает с кариррованием. Так как каррирование - это нотация вызова функций от 1 аргумента. А частичному применению плевать сколько аргументов у функций. Хоть 100500. То есть одно это теплое, а второе это цистерна. К слову сказать, никаких проблем у функциональщиков с каррированием в JS нет. Обратное мог сказать только человек, который понятия не имеет что такое FP и что для него нужно. ( Каррирование ненужно - это костыль для нотации)
@onetwothree123-
@onetwothree123- Жыл бұрын
Мы поняли, что это такое, теперь осталось понять нафиг оно нам нужно
@Albert_Hall
@Albert_Hall Жыл бұрын
const curry_with_Soer = (great) => (great) => console.log("Great"). 🌱
Инвариант в программировании
18:54
ONE MORE SUBSCRIBER FOR 6 MILLION!
00:38
Horror Skunx
Рет қаралды 15 МЛН
Comparing all elements of two tuples (with all() functionality)
4:27
Чудовищно функциональный JavaScript
21:31
Как пройти в IT?
Рет қаралды 54 М.
JWT авторизация. Основы JWT - механизма.
6:45
Хочу вАйти
Рет қаралды 2,1 М.
Какой полиморфизм в JavaScript?
14:43
S0ER
Рет қаралды 16 М.
Каррирование в JavaScript
16:14
Веб-разработка - DevMagazine
Рет қаралды 8 М.
ONE MORE SUBSCRIBER FOR 6 MILLION!
00:38
Horror Skunx
Рет қаралды 15 МЛН