Функциональное программирование от А до Я. ФП на JS. Монады, функторы, каррирование, композиция
Ғылым және технология
В этом видео мы поговорим про функциональное программирование на javascript. Разберем такие темы как: Декларативность, Чистые функции и сайд эффекты, Иммутабельность (неизменяемость), Функции первого класса, Функции высшего порядка, Композиция/конвейер, Частичное применение и каррирование, Chaining, Контейнеры, Функторы и аппликативные функторы, Монады, Спецификация Fantasy-Land
Мой курс "Продвинутый Frontend. В production на React", скидка 20% - ulbitv.ru/frontend
Таймкоды:
00:00 ➝ Введение
01:30 ➝ План на урок
04:00 ➝ Что такое ФП? Сравнение с ООП
07:20 ➝ Концепции ФП
09:00 ➝ Декларативность vs императивность
13:25 ➝ Чистые функции и сайд эффекты
18:10 ➝ Иммутабельность (неизменяемость данных)
22:40 ➝ Минусы мутабельности и преимущества иммутабельности
24:20 ➝ Функции первого класса
26:40 ➝ Функции высшего порядка
31:20 ➝ Смысл концепций ФП
33:10 ➝ Композиция (compose)
37:00 ➝ Конвейер (pipe)
37:45 ➝ Каррирование и частичное применение
45:50 ➝ chaining (цепочки вызовов)
46:40 ➝ Контейнеры
52:05 ➝ Функторы и монады
58:55 ➝ Аппликативные функторы
01:03:10 ➝ Спецификация Fantasy land
01:04:10 ➝ Другие монады (either, future, writer)
01:06:40 ➝ Время ставить лайки и писать комментарии) всем спасибо!
Ссылка на мой телеграм канал - t.me/ulbi_tv
Поддержать меня и мой канал вы можете по ссылкам ниже.
Patreon/boosty (доступ к бонусам) - boosty.to/ulbitv
Qiwi кошелек - qiwi.com/n/BODYE821
Яндекс деньги - yoomoney.ru/to/4100116193037469
Пікірлер: 231
Сегодня досрочно закрыл испытательный срок на своей первой работе фронтом 🎉🎉🎉 во многом благодаря Тимуру🎉🎉🎉, прошел почти весь курс, не дошел только до последнего раздела. Проходил ещё на первом потоке, у меня там была аватарка с вислоухим котом😺 когда прошел, на полгода забросил, но всё-таки взял себя в руки и устроился😊 всем удачи и верьте в себя!
@es7729
11 күн бұрын
Мои поздравления! Красавчик!
@vladislavkomkov5178
9 күн бұрын
Хвастайся зп в 3 кириешки))
@webtensei2327
8 күн бұрын
@@vladislavkomkov5178так все с чего-то начинают)
@diamondserg-43
4 күн бұрын
Молодец!
По-моему, на 51:00 f и g нужно поменять местами. Сначала применяется f (она должна быть внутри), а потом g.
Обожаю твои уроки. Нет никого, кто объяснял бы понятнее и интереснее
@UlbiTV
12 күн бұрын
Стараемся, спасиб)
@404Negative
10 күн бұрын
неет нееет никого кроме бога одного
Интересная тема для меня. В свое время проходил курс по Haskell, поэтому постараюсь дополнительно разъяснить про Монаду и Аппликативный функтор, если кому-то интересно, но не до конца понятно. 1) Монада - это структура, являющаяся наследником Функтора, но для которой дополнительно реализован метод chain. В разных языках/библиотеках название может быть разным. chain очень похож на map, отличие в том, что передаваемая в метод chain функция возвращает не значение (как в случае с map), а сам контейнер, в который запаковано значение. Пример Монады, который прямо под носом, но не был в таком ключе упомянут в видео - это Array. Для него методом chain по своей сути является flatMap: ведь функция, передаваемая во flatMap возвращает сам контейнер - Array: const duplicate = (arr) => arr.flatMap((n) => [n, n]); duplicate([1,2,3]); // [1,1,2,2,3,3] ramdajs.com/docs/#chain Как видно из примера, Монада - это более мощный интерфейс, чем Функтор, потому что позволяет менять не только запакованные значения(в случае с map), но и структуру самого контейнера. При использовании Maybe как Монады мы можем преобразовать Maybe в Nothing (использую псевдо-код): Maybe.of(1).chain(() => Nothing); // Nothing Maybe.of(1).chain((n) => Maybe.of(n * 2)); // Maybe(2) Используя Maybe как Функтор, мы можем изменить только значение, но не сам контейнер: Maybe.of(1).map((n) => n * 2); // Maybe(2) Промис в некотором понимании можно использовать и как Функтор, и как Монаду: Promise.resolve(1).then((n) => n * 2); Promise.resolve(1).then((n) => Promise.resolve(n * 2)); 2) Если кратко говорить про Аппликативный функтор, то он нужен, чтобы применять обычную функцию к упакованным значениям. Важно, чтобы все аргументы функции были одного типа. Например, у нас есть функция сложения, работающая с примитивами: const sum = (a, b) => a + b; Но мы хотим сложить не просто 2 числа, а 2 числа, упакованных в Maybe, причем сделать это лаконично и переиспользуя функцию sum. Maybe является Аппликативным функтором, т.к. реализует метод ap. Поэтому можем решить задачу так: const maybeResult = liftA2(sum, maybe1, maybe2); Если хотя бы 1 из переданных Maybe окажется Nothing, то результат всего выражения будет Nothing: такое поведение прописано в реализации ap для Maybe, которая дергается внутри liftA2. Для других структур поведение может быть своим, главное, чтобы оно удовлетворяло законам Аппликативных функторов. 3) Также можно упомянуть, что любая Монада является Аппликативным функтором, а любой Апликативный функтор является обычным Функтором. Это видно на схеме спецификации fantasy-land. На практике это означает, что если нам нужно объявить какую структуру Монадой, то нам достаточно реализовать только метод chain, а реализация методов ap и map будут выведены автоматически.
Сразу лайк! Нет сомнений в качестве
@LeonidPolyakov
12 күн бұрын
Да, 100 процентов будет адекватно и информативно.
Ролик вышел, как раз за час, до собеса. Решил быстро глянуть. И на собесе, спросили про функциональное программирование и функции высшего порядка. И я как выдал всю базу, которая есть в ролике, даже доп вопросов не задали😂. Спасибо Тимур за твой труд, за твои бесплатные и платный курсы.
Жду структурное программирование на Rust или Go))
@nikitatimofeenko9351
8 күн бұрын
Поддерживаю, ждем структурное программирование с примерами и на Rust и на Go
@user-yq6vo5vb9p
7 күн бұрын
@@nikitatimofeenko9351 поддерживаю поддерживание, ждем структурное программирование с примерами и на Rust и на Go
Твой ролик про ООП был просто шикарен, поэтому я невероятно ждал видео про ФП! Спасибо большое, Тимур!
@UlbiTV
12 күн бұрын
Спасибо! Жду фидбек))
Вообще, когда только начинал изучение JavaScript, считал его именно функциональным языком. Да и по факту большую часть времени пишу в функциональном стиле, и люблю его больше чем ООП. По-моему на фронте в ООП пишут только Ангулярщики, но могу ошибаться. Спасибо за очень информативный ролик, как всегда лучший!
Хочется сказать слова поддержки и выразить свое уважение к автору проделанную им работу. Спасибо Человек, ты делаешь этот мир лучше! Проделанная тобой работа помогает действительно стремящимся к знаниям людям получить их быстро и безболезненно, продолжай очень нравится. Творческих успехов и активной аудитории тебе!
@UlbiTV
9 күн бұрын
Спасибо за такие слова ❤️🙏
Спасибо за контент. Всё равно на какую тему ролик от этого автора, главное что 100% это будет полезно.
супер контент!!! ждал! спасибо за труд!
Интересна штука особенно про монады, захотелось попробовать применять для избавления фигурных скобочек if error try catch и тд, единственное не хочется терять в производительности из за красоты, не знаю насколько v8 оптимизирует такие функциональные фокусы
Лайк! 🎉
просто шикарно!
Спасибо ЮЛЬБИ!!! уникальный качественный контент
Не понимаю как я не подписался на тебя раньше, хотя просматривал твои ролики до этого момента. Очень доходчиво объясняете и отличная дикция!
@UlbiTV
12 күн бұрын
Спасибо!
Очень наглядное руководство по ФП! Разработчики, поделитесь опытом, может кто-то использовал ФП у себя в проектах? У меня дальше carry,compose,map в рамках ramda и lodash дело не пошло. С ts типизацией очень громоздкий код получался.
Фунцкиональный стиль в JS это богоугодное дело! Жду не дождусь когда в спецификацию JS добавят конвейерный (pipeline) оператор |>
@awenn2015
6 күн бұрын
Я лично жду когда в js добавят выражение по типу этого (выражение раннего выхода как в котлинине) const a = 5 ;((a: number) => { const b = a-5 || return false }) (a) Что бы не проверять ифами какую то тему и выходить в ифе
Спасибо, что продолжаешь давать нам ценный контент!
ждем - про Микросервери , микрофронтенд И так далее 😊
Качество видео растет от ролика к ролику, смотрю почти каждый ролик и точно могу это сказать 😂 отличное введение в фп, но как ни крути, для полноценного фп надо писать не не js
Отличный ролик на самом деле. Я занимаюсь JS уже 3 года и в этом ролике я открыл для себя новые интересные применения функций. Они вроде бы и были логичными, но про них даже не думал
Для меня очень полезное видео, спасибо!
Сразу лайк не глядя! ❤
Юлби, жги! Мы тебя любим 🫶🏼 каждый ролик долгожданный!
@helenit4365
12 күн бұрын
Да!!!✨️🌟🔥
Видно, что как всегда стараешься, спасибо тебе огромное, но я понял только поверхностно (всегда стараюсь твои уроки перематывать по "300" раз пока полностью все не пойму...), но досконально на таких примерах наверно и не нужно, а то мозг под плавится ))!!! Надеюсь, что когда будешь делать какие-то уроки с живым кодом, то будешь и вспоминать про этот урок приводя примеры с живым кодом, думаю, что не только я это ценю ))) !!! Желаю тебе вдохновения по более и ждем следующих видео.
безусловно лайк!
Лайк со старта)❤
Тимур лучший, большое спасибо за видео. Твои уроки помогают разобраться лучше всего
Спасибо
Лайк и комментарий для продвижения автоматически, спасибо!
Хороший видос, апдейт по монтажу хороший, спасибо
Лайк однозначно, коммент для продвижения, и вопрос по другой теме - снимаешь разбор Rx.js? Могу ошибаться, но она в стиле фп вроде. И как продолжение темы, или в принципе для расширения кругозора интересно услышать твое мнение и опыт в ней.
Лайкос тебе, дружище, за работу!
Круто, спасибо за видео! 👍
очень интересно, спасибо!
Как раз подумывал курс купить, как диплом допишу, но раз такая скидочка, то нельзя откладывать Ну и ролик топ, как обычно
Дай бог тебе здоровья мужик
Спасибо за ролик, как всегда, качественно и наглядно
Это ОЧЕНЬ классный ролик, спасибо огромное! действительно, ни где не встречала так четко структурированной информации.
О, это для меня! Я, конечно, не программист, но иногда приходится писать код, причём в основном на Лиспе или VBA, где ООП не реализовано. И именно в Лиспе, функции - это основной и довольно мощный инструмент. Из-за специфики кода, при написании программы, сначала приходится прописывать все функции последовательно от самого высокого уровня вложенности до самого низкого.
Где то читал об ещё одно важное отличие процедуры от функции это то что процедуры могут изменять данные из глобальной области видимости, а в функциях такое обычно не приветствуется как раз из соображений чистоты функций.
Дуже чудовий розбір, мені як новачку дуже пізнавально
Феноменально! Как и всегда. Снимаю шляпу!
Лайк префом. btw я scala разраб
Как всегда супер-годный контент!!!! Спасибо!
Сразу лайк и коммент, огромное спасибо за видео😊
Спасибо огромнейшее за тонкость и глубину контента. Заставляет явно провернуться шестеренкам в голове 🤓 со шлейфом, что что-то понял )) Эстетично и со вкусом 🌹 считывается, что ты в теме не просто шаришь, знаешь концепции, но ещё и Чувствуешь 💛 гармонично ориентируешься, но и подставляешь себя под критику, чтобы динамически расширить познание и критического мышления, развить его живость, эластичность и остроту. Редкость. Ценно 🫶🏻
Блин, я искал буквально 3 дня назад видео по сравнению парадигм ООП и ФП, не нашел. И тут бабах! Очень кстати) Спасибо большое, Тимур!
Уникальный Ulbi, спасибо! Как всегда, очень крутой контент.
благодарю ♡. топчик 😍
Очень круто и информативно! Спасибо ♥️
Спасибо за труд!
Посмотрю потом, лайк поставил.
Супер, супер, супер !! Спасибо❤
вижу новый видос ставлю лайк
Господи, это превосходно! Я столько знаний получил с этого, мега круто! Причем как знаний по ФП, так и много-много знаний по js и лучшему пониманию того что происходит. А ещё мемоизация это лучший пример замыкания🤩 Тимур, это превосходно, ваш курс стоит покупки более чем! 💯💯💯
Good mentor
видео топ(пока не смотрел, но знаю это))
Качество визуализации стремительно растёт! Куда приятнее и легче смотреть на анимации в красивых цветах, чем на скриншоты где что-то непонятное написано от руки) Очень интересный урок! Спасибо!
like
Спасибо за твои труды! Не мог бы ты сделать подобный ролик про паттерны проектирования?
@UlbiTV
12 күн бұрын
В todo есть такой ролик
Оч круто, спасибо! Благодарю
Привет! Видео класс! Подскажи где ты рисуешь видеоряд? Слайды и т.д.
это что хоть такое-то? я неделю всасывал урок по вебпаку и тут нннныа и еще один видос подъехал! мне хотя бы половинку такой продуктивности
2:32 Я хоть и давно в вебе (3 года в js) но последние 5 пунктов вообще хз что это такое, как будто из ассемблера что то)) Хотя посмотрев ролик понимаешь что рано или поздно с опытом даже не зная этих заумных терминов сам приходишь к декларативности
Лайк!!!!
Топ)
Огнище огненное!! супер контент! спасибо!
Вот это тема
Спасибо большое Тимур Супер полезный и интересный ролик :) Долго тупил на функции каррирования, но в итоге разобрался)
Может для фана, ролик по Backend серверу на Haskell? Отличное расширение кругозора! (я просто адепт Haskell)
Ого, нічого собі, оце крутяк. За такий контент треба донатить
А ты видел nodejs со встроенным gpt? Такой забавный Франкенштейн, но выглядит круто: переход к коду программы на человеческом языке!
Спасибо за ролик! Я не специалист в ФП. Понравилось объяснение функторов и монад. Кажется мир ФП может много чего интересного принести в решение рутинных задач)
очень интересно, спасибо за видео , познавательно!
Круто, спасибо за урок, чувствуется хорошая экспертиза!
Спасибо за информацию. Довольно интересные подходы. И понимания в этом направлении стало побольше. :)
наконец-то достойная тема)
Карта развития или учебы для самостоятельного изучения есть у тебя?
В целом интересная теория, но со стороны большого опыта работы на Java с StreamApi, Function, Optional, Consumer и тп. в JS вся эта структура кажется сложнее, хотя плюс минус тоже самое. Для меня самое сложное было понять как работают кастомные хуки в реакте, как я понимаю это также все выходит из ФП, но так как в java нет прямой аналогии для меня это выглядело как магия
Благодарствую!
Хорош, братан, контент в кайф, давай еще, ваще красавчик, можно вот этого вот почаще?
Вижу новое видео, ставлю лайк
следующий шаг, это после этого псевдообьяснение монад и функторов, это объяснить дайрект стайл, алг эффекты и континуации
Видео - просто бомбическое! Может развить его плейлистом с более конкретными и практическими примерами?..
Спасибо Круто!!! Ждём nextjs 14 версию))
Perfect !
Отличное изложение. Только много опечаток. На 37:37 не выдержал.
🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰
В какой программе презентацию делаешь?
Спасибо!!!
Как же ты хорош!
44:55 у меня вопрос, как типизировать такие каррированные функции? Тупо возвращать function и результат?
Можно ли считать reducer чистой функцией, если у него дефолтное значение - переменная, определенная выше
@UlbiTV
12 күн бұрын
Можно) это аргумент, такой же, просто с дефолтным значением, на чистоту не влияет
клааааааааааааааааааааааааааааааааасс
Хороший монтаж. Люблю твои видосы связанные с теорией, оч круто обьясняешь (любимый ролик про eventLoop ) но вот видосы где ты пишешь код и обьясняешь мне не подходят, вообще не понимаю твоей подачи((
15:18 5 * 5 * 5 = 125
@404Negative
11 күн бұрын
он же об этом и говорит, что MODIFIER могут поменять. неужели это не очевидно ?
На 50:45 разве g и f справа от знака равенства не перепутаны?