Это видео недоступно.
Сожалеем об этом.

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

Поделиться
HTML-код
  • Опубликовано: 16 окт 2020
  • #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 года назад +54

    Почувствовал себя снова в универе. Подробнейшая теория какой-то странной функции без каких-либо объяснений для чего это вообще нужно. Пишу на JS уже 8 лет, ни разу вообще не слышал про каррирование. Зашел узнать, что это. Узнал. Но зачем узнал не узнал.

    • @user-tg1je2vj1c
      @user-tg1je2vj1c 2 года назад +2

      Если ты не писал в функциональной парадигме, то это нормально

    • @anatolyvatson2542
      @anatolyvatson2542 Год назад +3

      Автор покрайней мере обьяснил откуда ноги растут- из других языков, где под капотом транслятор приводит функции с несколькими аргументами к унарным

    • @pavelnenashev4353
      @pavelnenashev4353 11 месяцев назад

      что и .bind не использовал?

    • @rustavellyne
      @rustavellyne 9 месяцев назад

      @@anatolyvatson2542 а зачем делать так?

    • @gerda-morozova
      @gerda-morozova 5 месяцев назад

      Почти аналогично. Даже не представляю, где теоретически в том же фронтенде может понадобится каррирование.

  • @user-zn9je9ek8k
    @user-zn9je9ek8k 3 года назад +11

    "Важно понимать как правильно, но отвечать как ожидают" - мудро)))

  • @unknyver
    @unknyver 3 года назад +54

    Идея с рукописным вводом с планшета понравилась, возможно стоит попробовать чуть более затенить правую часть экрана и сделать шрифт белым. Спасибо за контент!)

    • @scaymetonn6041
      @scaymetonn6041 3 года назад

      Шрифт идеальный, пусть оставляет так как есть

    • @S0ERDEVS
      @S0ERDEVS  3 года назад +3

      Да, надо поиграться. Тоже не очень нравится как выглядит.

    • @scaymetonn6041
      @scaymetonn6041 3 года назад +1

      @@S0ERDEVS мне очень даже нравится, сомневаюсь что получится лучше

    • @fazleev
      @fazleev 3 года назад +2

      @SOER , нормально выглядит

    • @Galano-vx7xy
      @Galano-vx7xy 3 года назад

      @@S0ERDEVS Классно выглядит!!Цвет шрифта топ!!

  • @Kira-iv1io
    @Kira-iv1io 3 года назад +62

    Олдфаги: - Ваше каррирование чистая фальшь сударь!
    Любой JS Ньюфаг: - Это фишка языка, у нас такого добра много
    **Звуки уезжающего в закат гироскутера**

  • @OlegGoritsyn
    @OlegGoritsyn 3 года назад +47

    Не понятно зачем оно нужно, но очень интересно. Спасибо :-)

    • @DART2WADER
      @DART2WADER 3 года назад +5

      Я также не понимаю. Сам хотел это написать. Дичь какая-то. Какие-то извращения.

    • @nekosora6036
      @nekosora6036 3 года назад +2

      Что именно? Каррирование или частичное применение?

    • @TheProfessionalGambler
      @TheProfessionalGambler 3 года назад +11

      Частичным применением можно закрепить какой-то аргумент.
      Например есть функция умножения mult(x,y), закрепляем x = 2 получаем функцию удвоения double(y).

    • @pavelsolovyenko1975
      @pavelsolovyenko1975 3 года назад +5

      Согласен. интересно узнать в чем предпосылка создания каррирования в функциональных языках. Возможно оптимизация параллельного выполнения конечно.

    • @nekosora6036
      @nekosora6036 3 года назад +5

      @@pavelsolovyenko1975 функциональное программирование базируется на лямбда-исчислении. В нём есть функции только от одного аргумента. Чтобы эмулировать функцию от n аргументов, нужно делать функцию, которая принимает один аргумент и выдаёт функцию от n - 1 аргументов.
      Проще говоря, эта операция лежит в основе фп. Поэтому она также естественна как и сложение в арифметике

  • @Albert_Hall
    @Albert_Hall Год назад +3

    Услышал о каррировании, попытался что-то найти, включил данный видос и не понял о чем вообще речь :) *так как не был осведомлен о бэкграунде данного вопроса. Закрыл видос и пообещал вернуться сильнее :))). И вот пару дней спустя я возвращаюсь и понимаю смысл и уместность каждой высказанной автором фразы !). обещание сдержал) ухожу с чистой совестью). П.С. Хотя нет, надо вернуться еще разок еще сильнее :)) с умением влёгкую составлять примеры и отличать слёту друг от друга Каррирование и Частичное Применение Функций 🎳💡

  • @user-rz1bn3gl7q
    @user-rz1bn3gl7q 3 года назад +8

    Ничего не понял, но крайне интересно, кажись потом придется пересматривать еще раз

  • @hjetwd
    @hjetwd 3 года назад +17

    Текст голубой с тенью конечно хорош, но, думаю, белый с тенью, был бы лучше. По поводу подачи материала - сложно. Сложно тому, кто 1 раз слышит о каком-то каррировании (а видео, как я понял, для таких людей и предназначено). Я бы шел от простого к сложному - это как ребенку объяснять алфавит. Из деревянных кубиков строим дом. Каждый кубик - буква алфавита, а дом - слово. Из одних и тех же букв можно собрать разные слова, как и разные дома можно построить из одних и тех же кубиков. Дети вы все поняли? Дааа! .... Соер: Итак, представьте что буквы - это стройматериалы для постройки дома, а дом - это слово. Теперь рассчитаем кубатуру железобетона и сечение арматуры для монолитных конструкций. ..... Ученики: ЧТООО??? Да ну нахер, пойду в проститутки! =)))))))))))

    • @censored2279
      @censored2279 3 года назад

      Тут не вопрос что сложно, вопрос зачем это нужно? Почему именно какой то из вариантов луше/хуже, или просто они разные но решают одну проблему.

  • @BahtiyarBasharov
    @BahtiyarBasharov 3 года назад

    Интересный материал. Обьясняет доходчиво. Проще мне кажется не передать. Тема с планшетом вообще огонь!

  • @scaymetonn6041
    @scaymetonn6041 3 года назад +1

    Отличный формат, очень наглядно

  • @yarik256
    @yarik256 3 года назад

    Спасибо за отличное объяснение!

  • @volga_code
    @volga_code 2 года назад

    спасибо, наконец-то понял ) а то читал перевод стать о каррировании на hubr ничего не понятно было )

  • @andreychiglintcew5024
    @andreychiglintcew5024 3 года назад

    Спасибо за подачу, узнал много нового, пойду разбираться с карированием в TS, до этого видео не знал что такое вообще существует.

  • @andreekzz
    @andreekzz 3 года назад

    Крутое видео. Спасибо

  • @ensox
    @ensox 3 года назад +1

    Есть же варианты каррирования с использованием .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;
    };

  • @SiberianAndy
    @SiberianAndy 3 года назад +2

    Формат видео очень крутой! Тема тоже интересная, хотелось бы немного практических примеров. Я сам знаю только один пример, чтобы в реакте в обработчике события вместо (e) => func(e) можно было бы писать просто func, а сама функция уже возвращала бы другую с эвентом. Но и то этот пример скорее визуально делает код может быть более красивым, но с унарными вычислениями ничего общего не имеет. Так зачем нам каррирование в JS?)

  • @atlasua2021
    @atlasua2021 3 года назад +5

    Ааа дошло, это типо такая же бесполезная фигня, как в математике умножение бесконечностей?

  • @Epic0n
    @Epic0n 3 года назад +5

    Такой вариант каррирования не подойдет?
    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();
    };

  • @adskfksefn
    @adskfksefn 3 года назад +7

    Ничерта не понял, но оочень интересно

  • @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 года назад

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

  • @Oswee
    @Oswee 3 года назад +3

    Horoshaja podacha i interesno, no ja vsjo tak i ne ponjal zachem mnje eto v praktike. Gde mnje eto stoit ispolzovatj (krome interview)?

  • @olezhonnv3215
    @olezhonnv3215 3 года назад

    Многие пишут в коментах, что ничего не понял, или зачем это нужно.
    А вот Я - ПОНЯЛ! Я и раньше знал о частичном применении.
    Но никогда сам так не писал, не было смысла. Может пригодится когда-то - посмотрим.

  • @isopp7744
    @isopp7744 3 года назад

    S0ER, где я не смогу сделать декомпозицию, и мне прям вот никак - и нужно применить вот это всё?

  • @MbwiruEikura
    @MbwiruEikura 3 года назад +6

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

    • @qq77777
      @qq77777 3 года назад +3

      Типичный юзкейс - это усложнение архитектуры, когда у тебя есть a, b, c и ты такой пытаешься выпендриться перед коллегами какой ты прошаренный и в зависимости от аргумента "с" генеришь функцию либо a+b либо а - b. Если серьезно то применение этому есть, допустим у тебя есть код на Frontend и ты хочешь скрыть детали реализации каких либо вещей при нажатии на кнопку к тебе с сервера приходит функция либо набор функций, соответственно при получении на клиент - вызываешь ее.

    • @PavelKoryagin
      @PavelKoryagin 3 года назад +3

      @@qq77777 Если мне с сервера приходит набор функций, то я должен ОЧЕНЬ сильно доверять этому серверу. Но это ладно, где только тут каррирование? Если сервер отдаёт фронтенду функцию, то где та сила, которая заставит их сделать все эти функции арности строго 1 и никак иначе?

    • @user-id7vd8jq1b
      @user-id7vd8jq1b 3 месяца назад

      Да все это хрень собачья)

  • @andor1904
    @andor1904 3 года назад +3

    Мне кажется, стоило ещё в конце добавить варианты реального применения карирования и частичного применения

    • @user-sc9it9zd4g
      @user-sc9it9zd4g 2 года назад +1

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

  • @yrurunning651
    @yrurunning651 3 года назад +1

    На самом деле не вижу причины использовать утилити-функции из библиотек (например ramda.js) для имитации каррирования, когда можно просто вручную записать const f = x => y => z => x + y + z. Благодаря стрелкам можно по-настоящему каррировать функции без библиотек и кучи return

    • @yrurunning651
      @yrurunning651 3 года назад

      P.S. материал хороший, однозначно лайк и подписка) Каналы по разработке редко уделяют такое внимание теории

  • @akifjevda
    @akifjevda 3 года назад +1

    Подскажите модель планшета-рисовалки. Я так понимаю, это не просто планшет, а он еще и показывает что на нем написано.

  • @user-lc1ph5jg5k
    @user-lc1ph5jg5k 3 года назад +6

    давление сообщества...

  • @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 года назад

    Скажите, пожалуйста, что такое унарная функция и чёрточка около обычного названия функции?

    • @ainur.rakhmanov
      @ainur.rakhmanov 3 года назад

      Функция от одного аргумента.
      Ничего не значит. Это когда хочешь называть функцию одинакова, но хочешь показать, что это уже другая функция.

    • @garorobe
      @garorobe 3 года назад +1

      @@ainur.rakhmanov Много чего значит. Значит что ты говоришь на одном языке с остальным миром. Вещи вроде арности или что такое предикат выглядят глупым сахаром до тех пор пока не сталкиваешься с математическими корнями программирования и тем, что если ты всё-таки хочешь доказывать формальную корректность кода придётся стать математиком.

    • @slavaviktorov6053
      @slavaviktorov6053 3 года назад

      это все понятия из математики, включая штрих(черточку) в названии.

  • @johnykallisto6488
    @johnykallisto6488 3 года назад

    По звуку сразу видно клавиатура с синим свитчами, попробуй brown свитчи

  • @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

  • @nikolaysokolov9027
    @nikolaysokolov9027 3 года назад

    Отличная метафора о немножко беременна! Рукописный ввод с планшета отлично выглядит. Спасибо!

  • @olegivanov6163
    @olegivanov6163 3 года назад

    Спасибо Вам, S0ER, за разъяснение!
    Теперь я наконец-то знаю, что один из частных методов, которые мне приходится использовать по мере предметной необходимости, наделён "сообществом" отдельным "именем собственным", вокруг которого даже создаётся кодинг-идеологический ажиотаж. Забавно.
    В любом случае - за разъяснение - спасибо!

  • @vladyslavhalchyshak1176
    @vladyslavhalchyshak1176 3 года назад

    с какой целью используется каррирование? Где это применяется на практике?

    • @vladyslavhalchyshak1176
      @vladyslavhalchyshak1176 3 года назад

      @Психолог Лариса Бандура конечно зря, удаляйте)

  • @karelalex
    @karelalex 3 года назад +1

    Чё-т не понял прикола в JS в принципе относится к количеству аргументов свободно. Так что каррирование по честному, возможно, сделать и не очень-то и получится. В этом смысле чем так уж плохо каррирование методом частичного применения не очень понятно.

    • @a1ex_sk
      @a1ex_sk 3 года назад

      От задачи зависит. Иногда действительно нужно честное каррирование, иногда это просто желание (вполне разумное и обоснованное) следовать принципам и идиологии принятой в конкретном проекте. Но вот чего не понимаю, в чем проблема на js сделать честное автокаррирование? Да, это будет псевдо-рекурсия, но фактически никакой рекурсии там конечно нет, как и нет никаких проблем, обычно связываемых с рекурсией. Пример, созданный за три минуты без претензии на production ready jsbin.com/xanuboveca/edit?js,console

    • @RezetRoy
      @RezetRoy 3 года назад

      @@a1ex_sk можно пример реальной задачи?

  • @georgybunin8054
    @georgybunin8054 3 года назад +3

    "Важно понимать как правильно, но отвечать так как ожидают".
    Вообще с этим не согласен.
    Зачем порождать невежество.
    Ведь при ответе на этот вопрос можно начать с того, что
    "Для упрощения примем частичное применение функции за каррирование".
    Или так "в виду особенностей js решим данную задачу каррирования через частичные применения функции".
    Можно даже с такой ремарки начать свое решение:
    "Для имплементации сигнатуры каррирования применим рекурсивный вызов для всех аргументов функции".
    Мне кажется это даст тому кто собеседует понимание владения материалом, а не просто как обезьянка заучить решения задач типа:
    fn(x)(y)(z)
    Или реализуйте свой promise
    Или другую подобную дичь которую любят спрашивать на собеседованиях.

  • @sergeys4732
    @sergeys4732 3 года назад +1

    Просьба, писать белым цветом, а не синим, ничего же не видно

  • @vlad80212
    @vlad80212 3 года назад

    Что мешает использовать функцию с замыканием и позволять ввод лишь одного параметра за каждый вызов новой функции. И если функция уже имеет все параметры то поледущие её вызовы просто бы возвращали закешированый результат?

  • @belonit48
    @belonit48 3 года назад

    Можно ли назвать настоящие карирование частным случаем частичного применения ?

    • @krikuff
      @krikuff 3 года назад +3

      Нет, это концептуально разные вещи. Операция каррирования меняет функцию. Берет исходную функцию A и возвращает другую функцию B. Частичное применение же -- это вызов функции B на количестве параметров меньшем, чем есть у функции A. Другое дело, что ЖС слегка подменяет и склеивает эти понятия. Но делает это чертовски хорошо для изначально нефункционального языка

    • @S0ERDEVS
      @S0ERDEVS  3 года назад +1

      Нет, даже использовать частичное применение для эмуляции каррирования - это неправильно, просто в JS по-другому не сделаешь.

    • @krikuff
      @krikuff 3 года назад +1

      @@S0ERDEVS Методологически да, но кому хочется писать кучу скобок-то? Красота по мне в том, что можно в одних скобках частично применить несколько аргументов, а потом в других еще несколько. При этом такое поведение достигается не магией интерпретатора, а посредством языка (что в целом для интерпретируемых ЯП не удивительно)

    • @aidemalo
      @aidemalo 3 года назад

      @@S0ERDEVS лол, и вообще писать код - это неправильно, надо чтобы оно просто работало изначально

  • @user-li7sm7ux2q
    @user-li7sm7ux2q 3 года назад +3

    Кто то конкретно офигел, если спрашивает про это у джунов.

    • @phat80
      @phat80 3 года назад

      А что надо спрашивать у джунов? Что такое переменная? ))) Если знает, уже хорошо?

    • @danildemchenko6004
      @danildemchenko6004 2 года назад +1

      @@phat80 прототипы, промисы, асинхронщину, замыкание. Мало чтоли тем нормальных и интересных?

  • @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

  • @artur1998g
    @artur1998g 3 года назад +2

    В питоне есть функция functools.partial, которая позволяет частично передать аргументы в функцию. И ты можешь еще раз применить partial к функции, если надо.
    Это очень удобно, например, когда у тебя в коде несколько раз вызывается функция с одними и теми же аргументами, кроме одного.
    Как я понял, это и есть "частичное применение", только в питоне это явно, нежели как показано в js.
    А вот карирование в каких ситуациях применяется, я предположить немогу...
    Ну или может с карированием, как с метаклассами в питоне.
    "Если вы думаете применить карирование или нет, вам оно не нужно"

    • @user-ey5xw2nx9s
      @user-ey5xw2nx9s 3 года назад

      Хмм в Javascript есть Function.bind(obj, args...), если я Вас правильно понял

  • @k0dzer0
    @k0dzer0 3 года назад +10

    Не очень интересно - "почему", больше всего интересно "для чего и в каких ситуациях", тогда и стимул появится, разобрать даже в 10 раз сложнее систему, была бы надобность. Очень сложно представить, где это пригодится в формочках сайта или других задачах. Чем массив или объект данных, виде одного входного значения хуже, чем все его значения переданные, как отдельные аргументы, не понятно.

    • @isopp7744
      @isopp7744 3 года назад +1

      Не парься, друг, это они себе просто так повышение зп выпрашивают... По поводу пригодится, ну наверное речь пойдёт не о вебе, наверное для разработки библиотек и тп.

    • @k0dzer0
      @k0dzer0 3 года назад

      Ну если ЗП то ладно, главное, что бы не самооценку))), а-ля как Басков, какой я красивый и умный)). Очень слабо вериться, что такое может пригодится в библиотеках JS, иногда в код заглядывал, но такой белебирды там не встречал, потому что как правило сложность алгоритмов в простоте их решения, когда их уже видишь. Если предположим алгоритм Дейкстры понятно, что это такое и для чего, то это просто был какой-то вариант решения и выглядит мягко говоря, как понты, а не как эффективное решение, которое потом будет легко прочесть другим, чтобы понять с ходу, ну или как вариант, я что-то не понял, такое тоже часто бывает, не исключаю, но тогда лишь только потому, что недоступно объяснили.

    • @isopp7744
      @isopp7744 3 года назад +1

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

    • @yrurunning651
      @yrurunning651 3 года назад +1

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

  • @pavel-orlov
    @pavel-orlov 3 года назад

    Что-то у меня сложилось впечатление, что кое-кто неверно передал задачу, которая бывала на собеседованиях и теперь это пошло-поехало по ютубу как испорченный телефон ) Когда просили реализовать каррирование, то указывали, что нужно написать функцию каррирования для заданного фиксированного числа аргументов. А по поводу частичного применения уже были вопросы в дальнейшем как раз с учетом приведенных в видео отличий. Понятно, что каррирование - частный случай частичного применения. И, кстати, это не противоречит определению, приведенному на learn.javascript: "Каррирование - это трансформация функций таким образом, чтобы они принимали аргументы не как f(a, b, c), а как f(a)(b)(c). Каррирование не вызывает функцию. Оно просто трансформирует её."

    • @S0ERDEVS
      @S0ERDEVS  3 года назад +2

      Каррирование - это не частный случай частичного применения, в этом и подвох. См. объяснение, например, тут - stackoverflow.com/questions/218025/what-is-the-difference-between-currying-and-partial-application/23438430#23438430

    • @pavel-orlov
      @pavel-orlov 3 года назад

      @@S0ERDEVS Не вижу там опровержения. Просто пояснение, что это разные понятия на типовом примере. Который в видео ты сам и рассказал. И никакого подвоха)

    • @S0ERDEVS
      @S0ERDEVS  3 года назад +1

      @Pavel Orlov просто говорить, что каррирование - частный случай частичного применения - неверно, следует из определения. Чего тут опровергать?

    • @pavel-orlov
      @pavel-orlov 3 года назад +1

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

    • @krikuff
      @krikuff 3 года назад +1

      @@pavel-orlov Ты не сможешь частично применить некаррированную функцию, поэтому каррирование -- не частный случай частичного применения. Все равно что говорить, что приготовление салата -- частный случай его поедания. Перед частичным применением функция каррируется в рантайме или в компайлтайме как ни крути. Функциональный чед выше привел более-менее достоверный источник термина каррирование -- вики хаскеля ( wiki.haskell.org/Currying )

  • @user-qw9wf6fw6b
    @user-qw9wf6fw6b 3 года назад

    Короче это какая-то черная магия. Я звоню в полицию

  • @master.joda987
    @master.joda987 3 года назад

    что не так с JavaScript'om?

  • @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 года назад +1

      В том что это частичное применение.

    • @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 года назад +1

      @Дмитрий Приданников во внутренней структуре, так можно сказать, что, скажем, между строкой и массивом строк нет разницы:
      "123"[1] // "2"
      ["1", "2", "3"][1] // "2"

  • @user-lz1yb6qk3f
    @user-lz1yb6qk3f 3 года назад

    А если я положу все аргументы в одну структуру, это будет являться каррированием?

    • @nekosora6036
      @nekosora6036 3 года назад

      Нет

    • @user-lz1yb6qk3f
      @user-lz1yb6qk3f 3 года назад

      @@nekosora6036, но я же приведу функцию к одному элементу. В чём разница?

    • @nekosora6036
      @nekosora6036 3 года назад

      @@user-lz1yb6qk3f это просто другое преобразование.

  • @chikenmacnugget
    @chikenmacnugget 3 года назад

    топ аниме коврик

  • @OB-el5ih
    @OB-el5ih 3 года назад +5

    синий цвет шрифта шрифт на планшете плохо на фоне видно

  • @jurafree426
    @jurafree426 8 месяцев назад

    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)
    }
    }

  • @NecroRomnt
    @NecroRomnt 3 года назад +2

    Бессмысленный комментарий ради продвижения канала.
    vim что бы выйти и сохранить можно использовать :x

    • @OlegGoritsyn
      @OlegGoritsyn 3 года назад

      А чтоб не сохранять? :-)

    • @NecroRomnt
      @NecroRomnt 3 года назад

      @@OlegGoritsyn так на видео :wq, я ради комментария под видео выдал бессмысленное предложение использовать :x.
      Человек пользующийся этой программой может для себя решить что ему использовать :w, :q!, :q, :x, :sh

    • @S0ERDEVS
      @S0ERDEVS  3 года назад +2

      Это да, но старую собаку новым трюкам не обучишь ) Привычка.

    • @distributedsystemsfanboy5208
      @distributedsystemsfanboy5208 3 года назад

      Бессмысленный ответ на бессмысленный комментарий для продвижения канала.
      :x не обновит mtime при выходе, если буфер не менялся. кому-то может быть важно.

    • @NecroRomnt
      @NecroRomnt 3 года назад

      @@distributedsystemsfanboy5208 , не знал, спасибо!

  • @zORg_alex
    @zORg_alex 3 года назад +14

    Я Сишарпер, и у меня только один вапрос: На У Я?

    • @nanvlad
      @nanvlad 3 года назад

      вернешься к этому видео, когда захочешь изучить F#

    • @zORg_alex
      @zORg_alex 3 года назад +2

      @@nanvlad а оно мне нужно? Посмотрел, и на сишарпе такую фигню сделать можно лямбдами. Вот только зачем? На английском сорсе упомянули какие-то продвинутое вычисления с какой-то древовидностью. Но хз где это применять. В общем если кто и спросит про курирование, скажу, что такими извращениями не занимаюсь. 😅

    • @nanvlad
      @nanvlad 3 года назад

      @@zORg_alex как говорится в одном известном меме: "Кто не понял - тот поймёт". Значит ещё не пришло то время, когда оно понадобится

    • @user-fe1dd4bd8f
      @user-fe1dd4bd8f 3 года назад

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

    • @user-cq3hr5op5q
      @user-cq3hr5op5q 3 года назад

      Насколько я понял, это программирование ради программирования. Как олимпиадные задачи. Ты можешь неплохо в них разбирать но быть бесполезным при решение практических задач. Знать это можно, но не обязательно.

  • @CyrilViXP
    @CyrilViXP 3 года назад

    Вот это такую херню на России на собеседованиях спрашивают?

  • @andriichornyi9143
    @andriichornyi9143 3 года назад +1

    Постарайтесь объяснять всё на "обычном языке": язык формул и терминов скрывает смысл. Ценность Ваших видео обратно пропорциональна плотности терминов и формул в нём. А можно сказать что чем меньше будет формул и терминов в Ваших видео тем в Ваших видео больше ценности. Расжовуйте пожалуйста лучше.

  • @eugeneponomarov7429
    @eugeneponomarov7429 3 года назад

    Неужели это "каррирование" настолько важно что насчёт этого вопроса идёт холивар?

    • @zmeygavrilych
      @zmeygavrilych 3 года назад +2

      Скорее всего холивар идёт насчёт вопроса важно оно, или нет )

    • @S0ERDEVS
      @S0ERDEVS  3 года назад

      Примерно так же важно как машина Тьюринга. Это один из столпов, гарантирующих верность работы программ в функциональных языках.

    • @DART2WADER
      @DART2WADER 3 года назад

      @@S0ERDEVS UB

  • @user-rr7yr9ml9p
    @user-rr7yr9ml9p 2 года назад

    слишком сложно о довольно простой штуке

  • @qaz261
    @qaz261 3 года назад +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;
      }

  • @PutlerXLO
    @PutlerXLO 3 года назад +5

    Эх, упустили мы момент, когда можно было отловить и зарубить на корню малочисленных любителей притащить свой haskell и прочую муть в JS... слышишь "лямбда"- стреляй на звук :)))

    • @Epic0n
      @Epic0n 3 года назад +2

      Вам лишь бы стрелять...

  • @demimurych1
    @demimurych1 Год назад +2

    Автор не разбирается в том, что пытается обьяснить. В следствии чего, в процессе сравнения теплого с цистерной, не только умудряется придумать какие-то проблемы у функциональщиков, но и придумать _оригинальное_ определение тому что такое теплое, а что такое цистерна. Судите сами:
    *Начнем с простого. С частичного применения. Или почему автор сравнивает теплое с цистерной*
    В случае же языка 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 и что для него нужно. ( Каррирование ненужно - это костыль для нотации)

  • @zmeygavrilych
    @zmeygavrilych 3 года назад +15

    Что не так с SOER? Зачем долго и нудно объяснять что-то, не объяснив сначала, зачем оно вообще нужно?

    • @S0ERDEVS
      @S0ERDEVS  3 года назад +3

      Что оно?

    • @garorobe
      @garorobe 3 года назад +4

      Потому что простого способа объяснить парадигмальные вещи не существует. Либо читать теорию до просветления, либо долбить практику до него же. Это как с ООП. Можно рассказать про классы и наследование, но это ничем не поможет тому, кто не понимает саму парадигму. "Знать и понимать"

    • @zmeygavrilych
      @zmeygavrilych 3 года назад +4

      ​@@garorobe Нет ничего проще, чем объяснить ООП. К тому же, вопрос "зачем оно вообще нужно" - это не про объяснение "парадигмальных вещей", а про элементарное применение на практике.

    • @zmeygavrilych
      @zmeygavrilych 3 года назад +1

      @@S0ERDEVS То, о чём видео.

    • @S0ERDEVS
      @S0ERDEVS  3 года назад +1

      @VG, видишь, ты даже не можешь дать определение своего "оно", а хочешь чтобы я понял зачем "оно" тебе нужно. Но в любом случае я не знаю нужно "оно" тебе или нет, не помогу с этим вопросом.

  • @onetwothree123-
    @onetwothree123- Год назад

    Мы поняли, что это такое, теперь осталось понять нафиг оно нам нужно

  • @Albert_Hall
    @Albert_Hall Год назад +1

    const curry_with_Soer = (great) => (great) => console.log("Great"). 🌱