Функциональное программирование от А до Я. ФП на JS. Монады, функторы, каррирование, композиция

  Переглядів 32,917

Ulbi TV

Ulbi TV

День тому

В этом видео мы поговорим про функциональное программирование на 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
@fatcat4168
@fatcat4168 11 днів тому
Сегодня досрочно закрыл испытательный срок на своей первой работе фронтом 🎉🎉🎉 во многом благодаря Тимуру🎉🎉🎉, прошел почти весь курс, не дошел только до последнего раздела. Проходил ещё на первом потоке, у меня там была аватарка с вислоухим котом😺 когда прошел, на полгода забросил, но всё-таки взял себя в руки и устроился😊 всем удачи и верьте в себя!
@es7729
@es7729 10 днів тому
Мои поздравления! Красавчик!
@vladislavkomkov5178
@vladislavkomkov5178 8 днів тому
Хвастайся зп в 3 кириешки))
@webtensei2327
@webtensei2327 7 днів тому
@@vladislavkomkov5178так все с чего-то начинают)
@diamondserg-43
@diamondserg-43 3 дні тому
Молодец!
@Kokurorokuko
@Kokurorokuko 8 днів тому
По-моему, на 51:00 f и g нужно поменять местами. Сначала применяется f (она должна быть внутри), а потом g.
@ker4ik13
@ker4ik13 11 днів тому
Обожаю твои уроки. Нет никого, кто объяснял бы понятнее и интереснее
@UlbiTV
@UlbiTV 11 днів тому
Стараемся, спасиб)
@404Negative
@404Negative 9 днів тому
неет нееет никого кроме бога одного
@dmitrykuskov6715
@dmitrykuskov6715 7 днів тому
Интересная тема для меня. В свое время проходил курс по 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 будут выведены автоматически.
@vitalex9383
@vitalex9383 10 днів тому
Ролик вышел, как раз за час, до собеса. Решил быстро глянуть. И на собесе, спросили про функциональное программирование и функции высшего порядка. И я как выдал всю базу, которая есть в ролике, даже доп вопросов не задали😂. Спасибо Тимур за твой труд, за твои бесплатные и платный курсы.
@-Forever-Young-
@-Forever-Young- 11 днів тому
Сразу лайк! Нет сомнений в качестве
@LeonidPolyakov
@LeonidPolyakov 11 днів тому
Да, 100 процентов будет адекватно и информативно.
@user-kw8cq6cd6y
@user-kw8cq6cd6y 11 днів тому
Жду структурное программирование на Rust или Go))
@nikitatimofeenko9351
@nikitatimofeenko9351 7 днів тому
Поддерживаю, ждем структурное программирование с примерами и на Rust и на Go
@user-yq6vo5vb9p
@user-yq6vo5vb9p 6 днів тому
@@nikitatimofeenko9351 поддерживаю поддерживание, ждем структурное программирование с примерами и на Rust и на Go
@Michael-bf7pm
@Michael-bf7pm 11 днів тому
Твой ролик про ООП был просто шикарен, поэтому я невероятно ждал видео про ФП! Спасибо большое, Тимур!
@UlbiTV
@UlbiTV 11 днів тому
Спасибо! Жду фидбек))
@sidless3862
@sidless3862 11 днів тому
Вообще, когда только начинал изучение JavaScript, считал его именно функциональным языком. Да и по факту большую часть времени пишу в функциональном стиле, и люблю его больше чем ООП. По-моему на фронте в ООП пишут только Ангулярщики, но могу ошибаться. Спасибо за очень информативный ролик, как всегда лучший!
@midrala
@midrala 9 днів тому
Хочется сказать слова поддержки и выразить свое уважение к автору проделанную им работу. Спасибо Человек, ты делаешь этот мир лучше! Проделанная тобой работа помогает действительно стремящимся к знаниям людям получить их быстро и безболезненно, продолжай очень нравится. Творческих успехов и активной аудитории тебе!
@UlbiTV
@UlbiTV 8 днів тому
Спасибо за такие слова ❤️🙏
@ode2877
@ode2877 4 дні тому
Интересна штука особенно про монады, захотелось попробовать применять для избавления фигурных скобочек if error try catch и тд, единственное не хочется терять в производительности из за красоты, не знаю насколько v8 оптимизирует такие функциональные фокусы
@aliicomua1369
@aliicomua1369 10 днів тому
Спасибо за контент. Всё равно на какую тему ролик от этого автора, главное что 100% это будет полезно.
@user-uk1cu2hm2f
@user-uk1cu2hm2f 11 днів тому
супер контент!!! ждал! спасибо за труд!
@adelinaromanova8353
@adelinaromanova8353 11 днів тому
Лайк! 🎉
@user-rw3gf4te4e
@user-rw3gf4te4e 11 днів тому
просто шикарно!
@user-dw8lb8lc7u
@user-dw8lb8lc7u 11 днів тому
Спасибо ЮЛЬБИ!!! уникальный качественный контент
@solovievss
@solovievss 11 днів тому
Очень наглядное руководство по ФП! Разработчики, поделитесь опытом, может кто-то использовал ФП у себя в проектах? У меня дальше carry,compose,map в рамках ramda и lodash дело не пошло. С ts типизацией очень громоздкий код получался.
@konstantinsologub9568
@konstantinsologub9568 11 днів тому
Не понимаю как я не подписался на тебя раньше, хотя просматривал твои ролики до этого момента. Очень доходчиво объясняете и отличная дикция!
@UlbiTV
@UlbiTV 11 днів тому
Спасибо!
@user-yt9he6ud5r
@user-yt9he6ud5r 9 днів тому
Фунцкиональный стиль в JS это богоугодное дело! Жду не дождусь когда в спецификацию JS добавят конвейерный (pipeline) оператор |>
@awenn2015
@awenn2015 5 днів тому
Я лично жду когда в js добавят выражение по типу этого (выражение раннего выхода как в котлинине) const a = 5 ;((a: number) => { const b = a-5 || return false }) (a) Что бы не проверять ифами какую то тему и выходить в ифе
@Roger-qj4wu
@Roger-qj4wu 11 днів тому
Спасибо, что продолжаешь давать нам ценный контент!
@tahrizade
@tahrizade 11 днів тому
ждем - про Микросервери , микрофронтенд И так далее 😊
@falsetrue7910
@falsetrue7910 11 днів тому
Качество видео растет от ролика к ролику, смотрю почти каждый ролик и точно могу это сказать 😂 отличное введение в фп, но как ни крути, для полноценного фп надо писать не не js
@nikman5541
@nikman5541 11 днів тому
Отличный ролик на самом деле. Я занимаюсь JS уже 3 года и в этом ролике я открыл для себя новые интересные применения функций. Они вроде бы и были логичными, но про них даже не думал
@VolodymyrSirenko
@VolodymyrSirenko 11 днів тому
Для меня очень полезное видео, спасибо!
@barbatage5078
@barbatage5078 11 днів тому
Сразу лайк не глядя! ❤
@MAKS-FISHER
@MAKS-FISHER 5 днів тому
Видно, что как всегда стараешься, спасибо тебе огромное, но я понял только поверхностно (всегда стараюсь твои уроки перематывать по "300" раз пока полностью все не пойму...), но досконально на таких примерах наверно и не нужно, а то мозг под плавится ))!!! Надеюсь, что когда будешь делать какие-то уроки с живым кодом, то будешь и вспоминать про этот урок приводя примеры с живым кодом, думаю, что не только я это ценю ))) !!! Желаю тебе вдохновения по более и ждем следующих видео.
@barbatage5078
@barbatage5078 11 днів тому
Юлби, жги! Мы тебя любим 🫶🏼 каждый ролик долгожданный!
@helenit4365
@helenit4365 11 днів тому
Да!!!✨️🌟🔥
@sattorerror
@sattorerror 11 днів тому
безусловно лайк!
@nk_77777
@nk_77777 11 днів тому
Лайк со старта)❤
@user-zb3fy2je8b
@user-zb3fy2je8b 11 днів тому
Тимур лучший, большое спасибо за видео. Твои уроки помогают разобраться лучше всего
@Sershir
@Sershir 11 днів тому
Спасибо
@eunicsi
@eunicsi 11 днів тому
Лайк и комментарий для продвижения автоматически, спасибо!
@ammoney159
@ammoney159 11 днів тому
Хороший видос, апдейт по монтажу хороший, спасибо
@kowkavn2356
@kowkavn2356 10 днів тому
Лайк однозначно, коммент для продвижения, и вопрос по другой теме - снимаешь разбор Rx.js? Могу ошибаться, но она в стиле фп вроде. И как продолжение темы, или в принципе для расширения кругозора интересно услышать твое мнение и опыт в ней.
@musicthreads
@musicthreads 11 днів тому
Лайкос тебе, дружище, за работу!
@WinchesterD
@WinchesterD 11 днів тому
Круто, спасибо за видео! 👍
@samiracle9852
@samiracle9852 11 днів тому
Как раз подумывал курс купить, как диплом допишу, но раз такая скидочка, то нельзя откладывать Ну и ролик топ, как обычно
@psycho0sis
@psycho0sis 11 днів тому
очень интересно, спасибо!
@miRorshik
@miRorshik 2 дні тому
Где то читал об ещё одно важное отличие процедуры от функции это то что процедуры могут изменять данные из глобальной области видимости, а в функциях такое обычно не приветствуется как раз из соображений чистоты функций.
@yohohowowowo9471
@yohohowowowo9471 11 днів тому
О, это для меня! Я, конечно, не программист, но иногда приходится писать код, причём в основном на Лиспе или VBA, где ООП не реализовано. И именно в Лиспе, функции - это основной и довольно мощный инструмент. Из-за специфики кода, при написании программы, сначала приходится прописывать все функции последовательно от самого высокого уровня вложенности до самого низкого.
@alexsibrin715
@alexsibrin715 11 днів тому
Дай бог тебе здоровья мужик
@Feniks20000
@Feniks20000 10 днів тому
Спасибо за ролик, как всегда, качественно и наглядно
@user-gd4vi6fv1z
@user-gd4vi6fv1z 9 днів тому
Это ОЧЕНЬ классный ролик, спасибо огромное! действительно, ни где не встречала так четко структурированной информации.
@Vadym_Lantukh
@Vadym_Lantukh 10 днів тому
Дуже чудовий розбір, мені як новачку дуже пізнавально
@yakut54
@yakut54 11 днів тому
Феноменально! Как и всегда. Снимаю шляпу!
@lolimon58
@lolimon58 11 днів тому
Лайк префом. btw я scala разраб
@HaywasterChannel
@HaywasterChannel 8 днів тому
Блин, я искал буквально 3 дня назад видео по сравнению парадигм ООП и ФП, не нашел. И тут бабах! Очень кстати) Спасибо большое, Тимур!
@alexstepanchhuk683
@alexstepanchhuk683 6 днів тому
Как всегда супер-годный контент!!!! Спасибо!
@n1kaka
@n1kaka 11 днів тому
Сразу лайк и коммент, огромное спасибо за видео😊
@03Rai
@03Rai 9 днів тому
благодарю ♡. топчик 😍
@user-fw1ws8lr8n
@user-fw1ws8lr8n 4 дні тому
Очень круто и информативно! Спасибо ♥️
@vetero4eg
@vetero4eg 3 дні тому
Уникальный Ulbi, спасибо! Как всегда, очень крутой контент.
@kristinavolk2660
@kristinavolk2660 5 днів тому
Спасибо огромнейшее за тонкость и глубину контента. Заставляет явно провернуться шестеренкам в голове 🤓 со шлейфом, что что-то понял )) Эстетично и со вкусом 🌹 считывается, что ты в теме не просто шаришь, знаешь концепции, но ещё и Чувствуешь 💛 гармонично ориентируешься, но и подставляешь себя под критику, чтобы динамически расширить познание и критического мышления, развить его живость, эластичность и остроту. Редкость. Ценно 🫶🏻
@KaHcTpykTap
@KaHcTpykTap 11 днів тому
Посмотрю потом, лайк поставил.
@LenaFelica_songwriter
@LenaFelica_songwriter 10 днів тому
Супер, супер, супер !! Спасибо❤
@skyranor6854
@skyranor6854 8 днів тому
Спасибо за труд!
@user-hu1gl5lw3p
@user-hu1gl5lw3p 11 днів тому
вижу новый видос ставлю лайк
@Bespokerug
@Bespokerug 11 днів тому
Спасибо за твои труды! Не мог бы ты сделать подобный ролик про паттерны проектирования?
@UlbiTV
@UlbiTV 11 днів тому
В todo есть такой ролик
@tesohi
@tesohi 11 днів тому
Господи, это превосходно! Я столько знаний получил с этого, мега круто! Причем как знаний по ФП, так и много-много знаний по js и лучшему пониманию того что происходит. А ещё мемоизация это лучший пример замыкания🤩 Тимур, это превосходно, ваш курс стоит покупки более чем! 💯💯💯
@abylaev8233
@abylaev8233 11 днів тому
like
@talantasanov4973
@talantasanov4973 11 днів тому
видео топ(пока не смотрел, но знаю это))
@inriinriinriinriinri
@inriinriinriinriinri 9 днів тому
Качество визуализации стремительно растёт! Куда приятнее и легче смотреть на анимации в красивых цветах, чем на скриншоты где что-то непонятное написано от руки) Очень интересный урок! Спасибо!
@vasil_astrov
@vasil_astrov 4 дні тому
Оч круто, спасибо! Благодарю
@nabijonazamov3695
@nabijonazamov3695 13 годин тому
Good mentor
@awenn2015
@awenn2015 5 днів тому
2:32 Я хоть и давно в вебе (3 года в js) но последние 5 пунктов вообще хз что это такое, как будто из ассемблера что то)) Хотя посмотрев ролик понимаешь что рано или поздно с опытом даже не зная этих заумных терминов сам приходишь к декларативности
@Aristockij
@Aristockij 10 днів тому
это что хоть такое-то? я неделю всасывал урок по вебпаку и тут нннныа и еще один видос подъехал! мне хотя бы половинку такой продуктивности
@user-zk3bc1lf8k
@user-zk3bc1lf8k 11 днів тому
Лайк!!!!
@user-hy4qw4ki3o
@user-hy4qw4ki3o 9 днів тому
Привет! Видео класс! Подскажи где ты рисуешь видеоряд? Слайды и т.д.
@itproust
@itproust 11 днів тому
Топ)
@Ramosok
@Ramosok 11 днів тому
Огнище огненное!! супер контент! спасибо!
@givename48
@givename48 9 днів тому
Может для фана, ролик по Backend серверу на Haskell? Отличное расширение кругозора! (я просто адепт Haskell)
@VolodymyrChernigiv1300
@VolodymyrChernigiv1300 10 днів тому
Ого, нічого собі, оце крутяк. За такий контент треба донатить
@olg3089
@olg3089 11 днів тому
Вот это тема
@user-wu8zt4we5n
@user-wu8zt4we5n 11 днів тому
А ты видел nodejs со встроенным gpt? Такой забавный Франкенштейн, но выглядит круто: переход к коду программы на человеческом языке!
@Kysok410
@Kysok410 10 днів тому
Спасибо большое Тимур Супер полезный и интересный ролик :) Долго тупил на функции каррирования, но в итоге разобрался)
@grigoryveynin8553
@grigoryveynin8553 9 днів тому
Спасибо за ролик! Я не специалист в ФП. Понравилось объяснение функторов и монад. Кажется мир ФП может много чего интересного принести в решение рутинных задач)
@adnike7013
@adnike7013 5 днів тому
очень интересно, спасибо за видео , познавательно!
@vladb3449
@vladb3449 4 дні тому
Круто, спасибо за урок, чувствуется хорошая экспертиза!
@user-frond-end_dev
@user-frond-end_dev 11 днів тому
Карта развития или учебы для самостоятельного изучения есть у тебя?
@user-nh8um2dn9s
@user-nh8um2dn9s 9 днів тому
Спасибо за информацию. Довольно интересные подходы. И понимания в этом направлении стало побольше. :)
@user-pw6gz6jh3i
@user-pw6gz6jh3i 11 днів тому
наконец-то достойная тема)
@yggllen
@yggllen 10 днів тому
В целом интересная теория, но со стороны большого опыта работы на Java с StreamApi, Function, Optional, Consumer и тп. в JS вся эта структура кажется сложнее, хотя плюс минус тоже самое. Для меня самое сложное было понять как работают кастомные хуки в реакте, как я понимаю это также все выходит из ФП, но так как в java нет прямой аналогии для меня это выглядело как магия
@crap2680
@crap2680 10 днів тому
Хорош, братан, контент в кайф, давай еще, ваще красавчик, можно вот этого вот почаще?
@some_body_qtyeeuy
@some_body_qtyeeuy 8 днів тому
Благодарствую!
@yarosav5396
@yarosav5396 7 днів тому
следующий шаг, это после этого псевдообьяснение монад и функторов, это объяснить дайрект стайл, алг эффекты и континуации
@user-dn4ry3uw8i
@user-dn4ry3uw8i 11 днів тому
Вижу новое видео, ставлю лайк
@victormog
@victormog 11 днів тому
Видео - просто бомбическое! Может развить его плейлистом с более конкретными и практическими примерами?..
@user-tb5tp2tv6x
@user-tb5tp2tv6x 11 днів тому
Спасибо Круто!!! Ждём nextjs 14 версию))
@larrybluesky
@larrybluesky 11 днів тому
Perfect !
@andrewkruchini8614
@andrewkruchini8614 6 днів тому
Отличное изложение. Только много опечаток. На 37:37 не выдержал.
@blatov
@blatov 11 днів тому
🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰
@dmitriynemkov1380
@dmitriynemkov1380 11 днів тому
В какой программе презентацию делаешь?
@user-lf5kk3bx9p
@user-lf5kk3bx9p 5 днів тому
Спасибо!!!
@user-wl2ok2mf6n
@user-wl2ok2mf6n 8 днів тому
Как же ты хорош!
@user-sc5qy2zw9s
@user-sc5qy2zw9s 11 днів тому
Можно ли считать reducer чистой функцией, если у него дефолтное значение - переменная, определенная выше
@UlbiTV
@UlbiTV 11 днів тому
Можно) это аргумент, такой же, просто с дефолтным значением, на чистоту не влияет
@user-on4lv7lc9k
@user-on4lv7lc9k 5 днів тому
Хороший монтаж. Люблю твои видосы связанные с теорией, оч круто обьясняешь (любимый ролик про eventLoop ) но вот видосы где ты пишешь код и обьясняешь мне не подходят, вообще не понимаю твоей подачи((
@awenn2015
@awenn2015 5 днів тому
44:55 у меня вопрос, как типизировать такие каррированные функции? Тупо возвращать function и результат?
@romanb7486
@romanb7486 10 днів тому
клааааааааааааааааааааааааааааааааасс
@TheArkan777
@TheArkan777 11 днів тому
15:18 5 * 5 * 5 = 125
@404Negative
@404Negative 10 днів тому
он же об этом и говорит, что MODIFIER могут поменять. неужели это не очевидно ?
@TarasovFrontDev
@TarasovFrontDev День тому
Про контейнеры на 48:00 я совсем не понял. Каким образом мы данные инкапсулировали, если они доступны через свойство инстанса?
Эффект Карбонаро и пончики
01:01
История одного вокалиста
Переглядів 3,7 млн
ТАК ПРОГРАММИРОВАЛИ НАШИ ДЕДЫ
21:18
Honey Montana
Переглядів 41 тис.
Tesla Cybertruck review - IT'S HERE!
23:07
808
Переглядів 1,6 млн
Просто о ООП (Парадигмы ООП)
21:14
webDev
Переглядів 40 тис.
Phone repairs are getting ridiculous - Here's why.
22:24
Mrwhosetheboss
Переглядів 1,8 млн
iPhone - телефон для нищебродов?!
0:53
ÉЖИ АКСЁНОВ
Переглядів 3,6 млн