Дмитрий Ховрич рассказывает как использовать строгую типизацию TypeScript и писать надёжный код в функциональном стиле. А также делится знаниями как использовать функторы и монады в ежедневной фронтенд разработке.
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
http://techtalks.nsu.ru
Видеозапись: http://www.youtube.com/watch?v=v7uBLSm6ft8
06 октября 2015. Как приручить дракона: введение в LLVM (Дмитрий Кашицын, HDsoft)
«В этом докладе мы кратко расскажем о таком звере, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.»
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
10 июня 2015. Дмитрий Кашицын (HDsoft) дает обзор LLVM.
http://techtalks.nsu.ru
Видеозапись: https://plus.google.com/events/ctes98f7uhf19t5jlvlbk24dan4
В этом докладе мы кратко расскажем о таком звере, как LLVM, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
В последнее время в промышленной разработке ПО особую популярность обретают Domain-Specific Lanugages (DSL). Они драматически упрощают разработку и дают возможность “программировать” не только программистам, но и пользователям прикладных программ.
В своем докладе я расскажу об опыте использования DSL применительно к С++, причем упор будет сделан на производительность кода DSL, и его мгновенную “встраиваемость” в запущенную программу путем компиляции DSL-кода в нативный код с помощью инструментария LLVM.
Иван Пузыревский — Введение в асинхронное программированиеYandex
Доклад посвящен основам асинхронного программирования. Мы кратко обсудим историю вопроса: что такое асинхронность, где, почему и зачем она используется. Затем рассмотрим наиболее частые способы построения асинхронных интерфейсов: основанные на callback'ах и на future/promise. В ходе доклада выделим основные используемые концепции, посмотрим на их реализацию и примеры использования. А в конце поговорим о сложностях, которые часто встречаются в асинхронном программировании.
Olexandra Dmytrenko
QA Automating at EPAM Systems
I'll show you how to switch from writing standard code using good old Java7 into writing it using functional way presented in Java8. The training is counted on beginners in the subject who like discovering the new horizons or for those who want to become more firm in using the new lambda features.
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
Флеш-накопители используются в самых разных устройствах, от мобильных телефонов до компьютеров и серверов. Для каждой модели накопителя нужна прошивка с определённым набором параметров, которые могут отличаться в зависимости от ситуации. В докладе будет описан универсальный фреймфорк на С++, который предоставляет разработчикам симуляторов простой, прозрачный и быстрый доступ к любому параметру. Тестировщикам же он позволяет управлять конфигурациями при помощи стандартных инструментов редактирования и слияния.
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
Евгений Крутько, НИЦ «Курчатовский институт».
В докладе на примере программы моделирования динамики движения конструкций по методу конечных элементов рассматриваются возможности и практика распараллеливания вычислений. Речь в нём пойдёт как о технике создания новых вычислительных потоков, так и об использовании стандартов openMP и MPI.
Мы решили разнообразить митапы практическими проверками знаний. Николай Птущук проводит викторину, которая состоит из несложных задачек на знание html, css, js. За правильный ответ можно было получить презент.
Использование Recoil в React и React Native приложениях | Odessa Frontend Mee...OdessaFrontend
Группа волонтеров по всему миру работает над React и React Native приложениями для ADHD America. В своей работе они используют Recoil — довольно новую библиотеку для работы с состоянием в Реакт приложениях. Сергей Журавель рассказывает почему они решили попробовать Recoil и показывает как использоватьт Recoil в React и React Native приложениях.
More Related Content
Similar to Функциональное программирование с использованием библиотеки fp-ts | Odessa Frontend Meetup #19
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
http://techtalks.nsu.ru
Видеозапись: http://www.youtube.com/watch?v=v7uBLSm6ft8
06 октября 2015. Как приручить дракона: введение в LLVM (Дмитрий Кашицын, HDsoft)
«В этом докладе мы кратко расскажем о таком звере, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.»
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
10 июня 2015. Дмитрий Кашицын (HDsoft) дает обзор LLVM.
http://techtalks.nsu.ru
Видеозапись: https://plus.google.com/events/ctes98f7uhf19t5jlvlbk24dan4
В этом докладе мы кратко расскажем о таком звере, как LLVM, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
В последнее время в промышленной разработке ПО особую популярность обретают Domain-Specific Lanugages (DSL). Они драматически упрощают разработку и дают возможность “программировать” не только программистам, но и пользователям прикладных программ.
В своем докладе я расскажу об опыте использования DSL применительно к С++, причем упор будет сделан на производительность кода DSL, и его мгновенную “встраиваемость” в запущенную программу путем компиляции DSL-кода в нативный код с помощью инструментария LLVM.
Иван Пузыревский — Введение в асинхронное программированиеYandex
Доклад посвящен основам асинхронного программирования. Мы кратко обсудим историю вопроса: что такое асинхронность, где, почему и зачем она используется. Затем рассмотрим наиболее частые способы построения асинхронных интерфейсов: основанные на callback'ах и на future/promise. В ходе доклада выделим основные используемые концепции, посмотрим на их реализацию и примеры использования. А в конце поговорим о сложностях, которые часто встречаются в асинхронном программировании.
Olexandra Dmytrenko
QA Automating at EPAM Systems
I'll show you how to switch from writing standard code using good old Java7 into writing it using functional way presented in Java8. The training is counted on beginners in the subject who like discovering the new horizons or for those who want to become more firm in using the new lambda features.
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
Флеш-накопители используются в самых разных устройствах, от мобильных телефонов до компьютеров и серверов. Для каждой модели накопителя нужна прошивка с определённым набором параметров, которые могут отличаться в зависимости от ситуации. В докладе будет описан универсальный фреймфорк на С++, который предоставляет разработчикам симуляторов простой, прозрачный и быстрый доступ к любому параметру. Тестировщикам же он позволяет управлять конфигурациями при помощи стандартных инструментов редактирования и слияния.
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
Евгений Крутько, НИЦ «Курчатовский институт».
В докладе на примере программы моделирования динамики движения конструкций по методу конечных элементов рассматриваются возможности и практика распараллеливания вычислений. Речь в нём пойдёт как о технике создания новых вычислительных потоков, так и об использовании стандартов openMP и MPI.
Мы решили разнообразить митапы практическими проверками знаний. Николай Птущук проводит викторину, которая состоит из несложных задачек на знание html, css, js. За правильный ответ можно было получить презент.
Использование Recoil в React и React Native приложениях | Odessa Frontend Mee...OdessaFrontend
Группа волонтеров по всему миру работает над React и React Native приложениями для ADHD America. В своей работе они используют Recoil — довольно новую библиотеку для работы с состоянием в Реакт приложениях. Сергей Журавель рассказывает почему они решили попробовать Recoil и показывает как использоватьт Recoil в React и React Native приложениях.
GatsbyJS считают убийцей WordPress и компилятором с кучей плюшек. Екатерина Шиповская рассматривает плюсы и минусы использования GatsbyJS. И помогает разобраться, так ли он хорош, и что делает его особенным.
Canvas API как инструмент для работы с графикой | Odessa Frontend Meetup #18OdessaFrontend
Существует ряд инструментов для работы с графикой в Web, в том числе Canvas API. Он на первый взгляд простой и не разнообразный, но вполне позволяет создать полноценный мир, ограниченный только вашим воображением и количеством оперативной памяти. Андрей Федотюк знакомит с основными принципами, некоторыми фишками и рассказывает все от базовой геометрии до создания полноценной игры.
Мы решили разнообразить митапы практическими проверками знаний. Николай Птущук проводит викторину, которая состоит из несложных задачек на знание html, css, js. За правильный ответ можно будет получить презент.
Скомпилировалось — значит работает. К сожалению это выражение не про typescript. Кажется, что количество рантайм ошибок спровоцированных несоответствием типов должно стать меньше, однако компилятор ts не помогает разработчику писать качественный код, а наоборот поощряет использование грязных хаков. Филипп Сапронов рассказывает, как прекратить войну с компилятором и писать более надёжный код, используя всю мощь системы типов. Доклад будет интересен тем, кому ts кажется простым или наоборот сложным, а также тем, кто хочет научится понимать код тайпингов таких библиотек как lodash.
Частые ошибки при разработке фронтенда | Odessa Frontend Meetup #17OdessaFrontend
Если еще несколько лет назад фронтенд это часто был простой и понятный интерфейс между пользователем и бекендом, то на сегодняшний день с учетом обилия фреймворков, либ и все возможных новшеств, фронтенд уже можно считать полноценным отдельным приложение со своей логикой и множеством подводных камней именно по этом сегодня как никогда важно задумываться о том, а как обеспечить простой и понятный процесс тестирования вашего фронта?
Как сделать так чтоб покрытие авто тестами не стало для вас болью или не для вас, но всё еще болью? Дмитрий Хименес обращает ваше внимание на несколько простых моментов, которые стоит учитывать при разработке фронтенда, чтобы сохранить возможность безболезненно сопровождать его автотестами.
OAuth2 и OpenID Connect простым языком | Odessa Frontend Meetup #17OdessaFrontend
OAuth2 и OpenID — это протоколы для защиты данных. Многие современные приложения и веб-приложения используют их чтобы защитить данные, которые предоставляют их сервисы. Однако они сложны, а информация которая доступна о них в интернете, зачастую противоречива и содержит множество терминологии ,что еще больше усложняет их понимание. В своем докладе Юрий Юдкин рассказывает как эти протоколы устроены и для чего они используются, простыми и понятными словами.
Объекты в ECMAScript | Odessa Frontend Meetup #16OdessaFrontend
Обычно мы задаем объекты литерально, через пару фигурных скобок. С их помощью мы можем моделировать окружающую нас действительность и описывать её в коде. А чем лучше мы знаем этот инструмент, тем более удивительные вещи мы можем творить с его помощью. Барабанов Дмитрий рассматривает объект с точки зрения спецификации EcmaScript. Это дает новую информацию к размышлению: а почему те или иные вещи работают именно таким образом в JavaScript?
Фриланс как профессиональная деградация | Odessa Frontend Meetup #16OdessaFrontend
Волшебное слово «Фриланс». Свободный график, отсутствие привязки к локации и свобода передвижения это то, с чем ассоциируется фриланс в первую очередь. Но является ли фриланс достойной альтернативой классической офисной работе на самом деле или это попытка выдать желаемое за действительное? Можно ли быть успешным фрилансером и высоко квалифицированным специалистом? Константин Кулаксыз рассказывает честно и без прикрас про дикий мир фриланса.
Cлайдер на CSS | Odessa Frontend Meetup #16OdessaFrontend
На сегодняшний день сложно себе представить сайт, на котором не будет слайдера. И, для его подключения, используется JS код, а иногда еще и с дополнительной библиотекой. Но Влад Цугульский рассказывает как написать свой простой слайдер на чистом СSS и при этом не нагружая сайт лишним кодом.
5 мая 2012 года мы с Женей Батовским рассказали о том, какие инструменты используют фронтендеры Яндекса. Это было больше чем просто доклад.
Я рассказал о сборке и оптимизации кода, а это было ещё до появления гранта, галпа и вебпака. И почти все утилиты написали коллеги из Яндекса.
Женя рассказал о том, как можно на одном компе собрать все браузеры и установить несколько версий одного браузера.
Это было 8 лет назад, тогда ещё лидировал Firefox, мы работали в Яндексе и у меня были дреды :)
Мы решили разнообразить митапы практическими проверками знаний. Николай Птущук проводит викторину, которая состоит из несложных задачек на знание html, css, js. За правильный ответ можно было получить презент.
В один прекрасный солнечный день вы осознаете, что ваш Vuex store и ваши Vuex модули переполнены дублирующимся кодом асинхронных вызовов и мутаций. Михаил Фарапонов рассказывает как сделать так, чтобы этого не допустить.
В современном мире тяжело понять, какие изменения положительно скажутся на сайте/приложении, а какие ему только навредят. Для этого есть масса инструментов и один из них — A/Б тестирование. Что это такое? Как его использовать? И, самое главное, зачем? Об этом рассказывает Сергей Полющенков.
Пощупать 3д в браузере | Odessa Frontend Meetup #15OdessaFrontend
Веб технологии давно позволяют прикоснуться ко всем 3 измерениям в браузере используя WebGL, и для этого достаточно понять самые простые принципы трехмерной графики. Что такое геометрия и материал. Как WebGL взаимодействует с ДОМэлементами и его событиями. Простыми словами про это подробно рассказывает веб-слесарь Константин Плаксивый.
Мы решили разнообразить митапы практическими проверками знаний. Николай Птущук проводит викторину, которая состоит из несложных задачек. За правильный ответ можно было получить презент.
Мы решили разнообразить митапы практическими проверками знаний. Николай Птущук проводит викторину, которая состоит из несложных задачек. За правильный ответ можно было получить презент.
Структуры данных в JavaScript | Odessa Frontend Meetup #13OdessaFrontend
Алгоритмы и структуры данных — это фундаментальные основы в программировании. Но, при изучении JavaScript, на это не хватает времени. Прогрессивные фрейморки высокоуровнего языка богаты функциональностью и оптимизацией, но достаточно ли этого? Николай Громов рассказывает как он понял, что алгоритмы никуда не ушли и почему понадобились структуры данных, а так же сравнивает их производительность на JavaScript.
Эффективность с большой буквы Э… или любой другой | Odessa Frontend Meetup #13OdessaFrontend
Вы часто слышали слова «Результативность», «Производительность», «Эффективность», но их смысл стал размываться. Евгений Кравцов рассказывает о настоящем значении этих слов, применительно к профессиональной деятельности. Все, что вы хотели знать об эффективности, но стеснялись спросить). И да, вы все это знаете и без него, просто не пытались систематизировать эти знания. И нет, это не тренинг личностного роста
5. Зачем писать код в функциональном стиле?
Функциональное программирование, как и любая другая парадигма,
накладывает дополнительные ограничения и правила.
Соблюдение этих ограничений и правил позволяет писать более надежный
код, который легче тестировать и повторно использовать.
6. Как мы можем себя ограничить во время написания кода?
“Хард” ограничения
● Компилятор TypeScript
○ Максимально строгий режим
○ TypeScript: Раскладываем tsconfig по
полочкам. Часть 1
○ TypeScript: Раскладываем tsconfig по
полочкам. Часть 2 — Всё про строгость
● ESLint
“Софт” ограничения
● Парадигма программирования
● Паттерны и лучшие практики
● Код ревью
7. Библиотека fp-ts
Библиотека fp-ts позволяет писать чистые функциональные приложения,
построенные поверх высокоуровневых абстракций из таких языков, как
Haskell, PureScript, и Scala.
● Паттерны и надежные абстракции из функционального мира
● Утилиты для композиции функций
● Функциональные типы данных
● Классы типов (type classes)
8. Класс типов
Класс типов определяет множество типизированных функций и констант,
которые должны существовать для каждого типа, который принадлежит
данному классу.
Основаны на теории категорий
9. Теория категорий
Теория категорий — раздел математики, изучающий свойства отношений
между математическими объектами, не зависящие от внутренней структуры
объектов.
11. Теория категорий
Вам не нужно изучать теорию
категорий для того, чтобы
использовать
функциональный подход в
Ваших программах!
12. Класс типов Show
interface Show<A> {
readonly show: (a: A) => string;
}
Тип A принадлежит классу Show, если для A определена функция show : (a:
A) => string
13. Реализации класса типов Show
const showNumber: Show<number> = {
show: n => n.toString()
};
const showUser: Show<User> = {
show: user => `User "${user.name}", ${user.age} years old`
};
15. Из чего состоит функциональное программирование?
Концепции, которые
“лежат на поверхности”
Концепции, которые
“спрятаны поглубже”
16. Концепции, которые “лежат на поверхности”
● Иммутабельные данные
● Чистые функции (referentially transparent)
○ Каррирование
● Побочные эффекты
● “Честные” сигнатуры функций (method signature honesty)
● Композиция функций (бесточечный стиль)
17. Иммутабельные данные
● Изменение данных путем пересоздания объектов / массивов
● TypeScript не поддерживает иммутабельные типы данных в runtime
○ Но скоро могут появятся записи (records) и кортежи (tuples)
● Ключевое слово readonly
○ ReadonlyArray
○ ReadonlyRecord
○ ReadonlyMap
○ ReadonlySet
● eslint-plugin-functional
18. Иммутабельные данные
const arr: readonly number[] = [1, 2, 3];
arr.push(4); // Property 'push' does not exist on type 'readonly number[]'
arr.pop(); // Property 'pop' does not exist on type 'readonly number[]'.
arr.unshift(); // Property 'unshift' does not exist on type 'readonly number[]'.
arr.shift(); // Property 'shift' does not exist on type 'readonly number[]'
arr.splice(1); // Property 'splice' does not exist on type 'readonly number[]'
19. Чистые функции
const sum = (a: number, b: number): number => a + b;
const multiply = (a: number, b: number): number => a * b;
const subtract = (a: number, b: number): number => a - b;
const divide = (a: number, b: number): number => a / b;
const dateToString = (date: Date): string => date.toDateString();
20. Чистые каррированые функции
const sum = (a: number) => (b: number): number => a + b;
const multiply = (a: number) => (b: number): number => a * b;
const byEmail = (email: string) => (user: User): boolean =>
user.email === email;
// Удобно применять когда функция ожидает предикат на вход
const user = users.find(byEmail("peter-parker@gmail.com"));
21. Чистые функции могут мутировать данные внутри себя
function shuffle<T>(array: readonly T[]): readonly T[] {
const arrayCopy = [...array];
for (let i = arrayCopy.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
const temp = arrayCopy[i];
arrayCopy[i] = array[j];
arrayCopy[j] = temp;
}
return arrayCopy;
}
22. Побочные эффекты
Побочный эффект - это изменение состояния системы или наблюдаемое
взаимодействие с окружающим миром, происходящее во время вычисления
результата.
● изменения в файловой системе
● обращение к базе данных
● выполнение http-запроса
● выброс ошибок
● вывод на экран / запись в лог
● получение данных от пользователя
● выполнение запроса к DOM
Любое взаимодействие со средой вне функции является побочным эффектом.
24. “Честные” сигнатуры функций
type User = {
readonly id: string;
readonly email: string;
};
declare function createUser(email: string): User;
25. Скрытые побочные эффекты внутри функции
function createUser(email: string): User {
if (email.length > 256) {
throw new Error("Email is too long!");
}
if (!email.includes("@")) {
throw new Error("Email is invalid!");
}
return { id: uuid(), email };
}
29. Композиция функций с применением pipe
import {pipe} from "fp-ts/function";
const value = 2;
const result = pipe(value, sum(2), multiply(3),
valueToString);
console.log(result); // 12
34. declare function getUsers(): readonly User[];
declare function createFullName(user: User): string;
const users = getUsers();
const result = pipe(
users.find(byEmail("spider-man@gmail.com")),
createFullName
);
Проблема композиции функций. Код скомпилируется?
35. Проблема композиции функций
// Argument of type 'User | undefined' is not
assignable to parameter of type 'User'.
// Type 'undefined' is not assignable to type 'User'.
const result = pipe(
users.find(byEmail("spider-man@gmail.com")),
createFullName
);
38. Объединения типов с дискриминантом
Объединения типов с дискриминантом - это объединения у которых
присутствует одно общее поле (с уникальным символом, чаще всего
строковым литералом).
Оно и будет служить дискриминантом, чтобы TypeScript по нему вывел что
же за тип у вас сейчас в руках.
39. Объединения типов с дискриминантом
type Success<T> = {
readonly type: "success";
readonly value: T;
}
type Fail = {
readonly type: "fail";
readonly error: Error;
}
type Result<T> = Success<T> | Fail;
40. Объединения типов с дискриминантом
declare function loadUsers(): Result<readonly User[]>;
const result = loadUsers();
// Property 'value' does not exist on type 'Result<readonly User[]>'
console.log(result.value);
// Property 'error' does not exist on type 'Result<readonly User[]>'
console.log(result.error);
41. Объединения типов с дискриминантом
switch (result.type) {
case "success":
console.log(result.value);
break;
case "fail":
console.log(result.error);
break;
default:
absurd(result); // typeof result is never
}
42. Тело функции absurd
function absurd<A>(_: never): A {
throw new Error('Called `absurd` function which
should be uncallable')
}
44. Option
Option - конструкция, описывающая наличие или отсутствие значения.
С помощью функций map и chain позволяет работать с цепочками вызовов
функций даже если какая-то из них может вернуть null / undefined.
Option - тип данных, предоставляемый библиотекой fp-ts
● Описание типа
● Функции для взаимодействия
45. Описание типа Option
type None = {
readonly _tag: 'None';
};
type Some<A> = {
readonly _tag: 'Some';
readonly value: A;
};
type Option<A> = None | Some<A>;
52. Пример использование Option
import {findFirst} from "fp-ts/ReadonlyArray";
// Option<User>
// { _tag: 'Some', value: { id: 1, email: "spiderman@gmail.com" } }
const value = pipe(
users,
findFirst(byEmail("spider-man@gmail.com"))
);
53. Пример использование Option
import { map } from "fp-ts/Option";
// Option<string>
// { _tag: 'Some', value: 'Peter Parker' }
const value = pipe(
users,
findFirst(byEmail("spider-man@gmail.com")),
map(createFullName)
);
54. Пример использование Option
import { map } from "fp-ts/Option";
// Option<string>
// { _tag: 'None' }
const value = pipe(
users,
findFirst(byEmail("mary-jane-watson@gmail.com")),
map(createFullName)
);
55. Описание типа функции Map для Option
type OptionMap =
<A, B>(f: (a: A) => B) =>
(fa: Option<A>) => Option<B>;
56. Реализация функции Map для Option
const map: OptionMap = f => option => {
switch (option._tag) {
case "None":
return option;
case "Some":
return { _tag: "Some", value: f(option.value) };
default:
return absurd(option)
}
}
57. map-ов может быть много
declare function stringHash(value: string): number;
// Option<number>
const value = pipe(
users,
findFirst(byEmail("spider-man@gmail.com")),
map(createFullName),
map(stringHash)
);
58. Функтор — это класс типов, для которых определена функция map и
соблюдаются некоторые законы:
● Закон идентичности
● Закон композиции
Законы - это ограничения, которые накладываются на реализацию функции
map.
В ежедневной работе Вам не придется писать свои функторы. Все
необходимые функторы реализованы в библиотеке fp-ts.
Функтор
61. Как избавиться от вложенных Option<T>
import {chain} from "fp-ts/ReadonlyArray";
const comments: Record<UserId, readonly Comment[]> = {};
// Option<readonly Comment[]>
const value = pipe(
users,
findFirst(byEmail("spider-man@gmail.com")),
chain(user => lookup(user.id, comments))
)
62. Описание типа функции Chain для Option
type OptionChain =
<A, B>(f: (a: A) => Option<B>) =>
(fa: Option<A>) => Option<B>;
63. Реализация функции Chain для Option
const chain: OptionChain = f => option => {
switch (option._tag) {
case "None":
return option;
case "Some":
return f(option.value);
default:
return absurd(option)
}
}
64. Монада
Монада - это класс типов, для которой определены функции map, chain, of и
соблюдаются некоторые законы:
● Закон идентичности
● Закон ассоциативности
Законы - это ограничения, которые накладываются на реализацию функции
chain.
В ежедневной работе Вам не придется писать свои монады. Все
необходимые монады реализованы в библиотеке fp-ts.
Монады используются для последовательных вычислений.
66. Как достать значение из Option?
import {toUndefined} from "fp-ts/Option";
// string | undefined
const value = pipe(
users,
findFirst(byEmail("spider-man@gmail.com")),
map(createFullName),
toUndefined
);
67. Как достать значение из Option?
import {constant} from "fp-ts/function";
import {getOrElse} from "fp-ts/Option";
// string
const value = pipe(
users,
findFirst(byEmail("spider-man@gmail.com")),
map(createFullName),
getOrElse(constant<string>("NO_NAME"))
);
68. Что еще интересного есть в fp-ts?
● Either - для работы с ошибками
● IO - для работы с побочными эффектами
● Task - для работы с асинхронным кодом
● TaskEither - для работы с асинхронным кодом, который может вернуть ошибку
● Reader - внедрение зависимостей в функциональном стиле
● State - для хранения состояния в композиции функций
● ReaderTaskEither - внедрение зависимостей в асинхронную функцию, которая
может вернуть ошибку
● Eq - для сравнения данных по значению
● Ord - для сортировки данных
● Semigroup - для конкатенации данных
● Monoid - для “сворачивания” данных (reduce)
69. Что почитать? Код из презентации
https://github.com/dkhovrich/fp-ts-talk-code#readme
71. Вакансия в команду Spark
● продуктовая компания и возможность влиять на сам продукт
● команда профессионалов
● стек технологий (TypeScript, React, RxJS, fp-ts)
● пробуем новые инструменты, подходы
● достойный компенсационный пакет от компании
● гибридный гибкий график (офис, ремоут)
Все вакансии Readdle - https://readdle.com/careers 🚀