Algebraic Data Types

Intro

bit.ly/3c49BB2

Проекты

Участвую в Fintech-проектах, где применяется функциональное реактивное программирование на TS.

ООП и ФП

Современные высокоуровневые языки - мультипарадигменные.

Есть исключения (только Фп) - 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 - алгебраический тип данных для сетевых взаимодействий