Algebraic Data Types
Intro
bit.ly/3c49BB2
Проекты
Участвую в Fintech-проектах, где применяется функциональное реактивное программирование на TS.
- Технологический стек:
— TypeScript, ts-node
— алгебраические типы данных функционального стека fp-ts - опенсорс FE платформа: dx-platform
- слой сетевого взаимодействия на базе remote-data, io-ts, swagger-codegen-ts
- стейт-менеджмент на RxJS
- ui-kit на react: @devexperts/react-kit
- применяются практики функционального реактивного программирования
ООП и ФП
Современные высокоуровневые языки - мультипарадигменные.
Есть исключения (только Фп) - Haskell, Elm, Erlang.
В языках ООп реализуются возможности для более удобного использования функциональных практик:
— lambda в Java
— Promise в JS (Futures в Haskell, Dart, Java)
— async/await в JS (частный случай do-notation из Haskell)
ООП: инкапсуляция, полиморфизм и наследование
FP: алгебраические типы данных и функции высших порядков
ООП и ФП
OOП:
- предметная область представляется в виде объектов произвольной структуры
- для реализации бизнес-логики объекты произвольно взаимодействуют друг с другом
- много свободы - легко писать как плохой код, так и хороший
- SOLID являются декларативными соглашениями для разумных ограничений этой свободы
- дизайн-паттерны для декларации популярных архитектурных решений на уровне соглашений
ООП и ФП
FP:
- предметная область и бизнес-логика выражаются в виде алгебраических типов данных и функций, отвечающих за композицию этих данных
- поставлены жесткие рамки - хороший код писать легче, чем плохой
- алгебраические структуры и алгебраические типы данных (как унифицированные, так и пользовательские) четко декларируют свое использование на уровне типов и кода
Algebraic Data Types (ADT)
Часто ADT называют контейнерными, т.к. часто для хранения данных в этих типах используются специальные структуры - контейнеры.
Все мы пользуемся такими ADT как Array и Promise:
// array
const array = [1, 2, 3, 4];
console.log({ array });
const arrayChanged = array.map((value) => value + 1);
console.log({ arrayChanged });
// promise
const promise = Promise.resolve(1);
console.log({ promise });
const promiseChanged = promise.then((value) => value + 1);
console.log({ promiseChanged });
Algebraic Data Types (ADT)
В мире ФП существует гораздо больше широко употребимых алгебраических типов данных и алгебраических структур.
Конечно же для этих ADT нет нативных реализаций в JS/TS, но самые широко употребимые реализованы в библиотеках. Надо отметить, что реализовать ADT (контейнерный тип данных) можно используя как ООп, так и Фп.
fp-ts - реализация алгебраических структур и типов данных в соответствии со спецификацией fantasy-land, выполненная в Фп.
На базе этой библиотеки развивается целая экосистема:
- io-ts - валидация данных при помощи type-guards
- remote-data - алгебраический тип данных для сетевых взаимодействий