Теория категорий
Теория категорий в индустрии
Haskell используется в финансовой компании Jane Street для торговли на миллиарды долларов, а fp-ts скачивается 3 миллиона раз в месяц. За этим стоит теория категорий - не академический курьёз, а инструментарий, который задаёт правила безопасного рефакторинга в промышленном коде.
- Финансы: Jane Street - миллиардный trading на Haskell и функторах
- Frontend: fp-ts (TypeScript) - 3M загрузок/месяц, functors в production
- Backend Scala: cats и ZIO - effect systems в финтех-компаниях
- Мобильная разработка: Arrow (Kotlin) - функторы в Android-приложениях
- Компиляторы: GHC - 40M строк Haskell работают через монады
- Microsoft Research: Koka - algebraic effects на теории категорий
Функторы: fmap во всём коде
GHC - компилятор Haskell - обрабатывает все side effects через монады. Это не метафора: каждый IO-action, каждый `do`-блок в 40 миллионах строк кода Haskell в production опирается на математическую структуру из теории категорий.
Функтор F: C -> D - это отображение категорий, сохраняющее структуру: объекты переходят в объекты, морфизмы в морфизмы, тождества в тождества, композиция в композицию. В коде функтор - это тип с операцией `fmap`, меняющей содержимое без изменения контейнера.
fp-ts (TypeScript), cats (Scala), Arrow (Kotlin) - все три библиотеки используются в production и называются в честь теории категорий. fp-ts скачивается 3 миллиона раз в месяц. Функторы - не академика, это способ структурировать реальный код.
Почему нарушение закона fmap (g . f) = fmap g . fmap f делает рефакторинг опасным? Приведите конкретный пример ломающегося кода.
Естественные преобразования: полиморфизм по-категориальному
В Haskell каждая параметрически полиморфная функция `f :: forall a. F a -> G a` - это естественное преобразование F => G. Это называется теоремой о свободных теоремах (free theorems, Wadler 1989). Компилятор знает о естественности, и это позволяет ему проводить оптимизации.
**Теорема Йонеды** утверждает: естественные преобразования из Hom(A, -) в F изоморфны F(A). В практическом смысле это значит: любой функтор полностью описывается тем, как он действует на один «тестовый» объект. Это основа continuation-passing style и церковного кодирования.
Функция `safeHead :: [a] -> Maybe a` - это естественное преобразование? Почему достаточно знать тип, чтобы ответить?
Parser combinators и effect systems
Parser combinators - одно из самых элегантных применений теории категорий. Parsec (Haskell), megaparsec, attoparsec используются в production компиляторах. GHC сам написан с parsec. Тип Parser a - это функтор, аппликатив и монада одновременно.
Effect systems в 2024: Rust использует типы для отслеживания async/sync. Koka (Microsoft Research) реализует algebraic effects через теорию категорий. ZIO (Scala) - production effect system в финтехе. Все они реализуют одну категориальную идею: эффекты как объекты первого класса.
Почему `Parser a` формирует монаду, а не просто функтор? Что добавляет монадическая структура к парсерам?
Ключевые идеи
- Функтор F: C -> D сохраняет структуру; в коде - тип с fmap, меняющий содержимое без изменения формы
- Законы функтора (fmap id = id, fmap (g.f) = fmap g . fmap f) гарантируют безопасный рефакторинг
- Параметрически полиморфная функция forall a. F a -> G a - автоматически естественное преобразование
- Parser combinators: Parsec/megaparsec в production GHC - функтор + аппликатив + монада
- Effect systems (IO, ZIO, Koka) реализуют категориальные структуры для управления побочными эффектами
Связанные темы
Функторы и естественные преобразования - строительные блоки монад и сопряжений.
- Монады — Монада = эндофунктор с дополнительной структурой
- Сопряжённые функторы — Каждое сопряжение F - G порождает монаду G.F