Добавить в корзинуПозвонить
Найти в Дзене
Art Libra

Галактика знаний - 0106 - Функторы — отображения, хранящие структуру

«Функтор — это стрелка между категориями, которая не ломает того, что внутри.» На прошлом уроке мы построили понятие категории — сети из объектов и стрелок с законами композиции. Теперь мы сделаем следующий шаг и научимся переносить одну категорию в другую целиком, не теряя структуру. Такой перенос называется функтором. Если категории — это вселенные знаний, то функторы — это порталы между ними. Сегодня мы узнаем, как строить такие порталы, почему они вездесущи и как Python помогает нам их создавать. Физика: квантование как функтор. В теоретической физике существует идея, что процесс квантования можно рассматривать как функтор из категории классических систем в категорию квантовых систем. Классическая фазовая плоскость переходит в гильбертово пространство, а классическая наблюдаемая — в оператор. Конечно, реальная физика сложнее и не всегда укладывается в простой функториальный формализм, но как направляющая идея это работает. Биология: от генов к признакам. Представьте категорию генот
Оглавление

«Функтор — это стрелка между категориями, которая не ломает того, что внутри.»

На прошлом уроке мы построили понятие категории — сети из объектов и стрелок с законами композиции. Теперь мы сделаем следующий шаг и научимся переносить одну категорию в другую целиком, не теряя структуру. Такой перенос называется функтором. Если категории — это вселенные знаний, то функторы — это порталы между ними. Сегодня мы узнаем, как строить такие порталы, почему они вездесущи и как Python помогает нам их создавать.

6.1. Что такое функтор?

6.2. Простейшие примеры функторов

-2

6.3. Функторы в разных науках

Физика: квантование как функтор. В теоретической физике существует идея, что процесс квантования можно рассматривать как функтор из категории классических систем в категорию квантовых систем. Классическая фазовая плоскость переходит в гильбертово пространство, а классическая наблюдаемая — в оператор. Конечно, реальная физика сложнее и не всегда укладывается в простой функториальный формализм, но как направляющая идея это работает.

Биология: от генов к признакам. Представьте категорию генотипов, где объекты — геномы, а стрелки — мутации. И категорию фенотипов, где объекты — признаки, а стрелки — возможные переходы между признаками в ходе развития. Функтор «экспрессия генов» переносит генетические изменения в фенотипические. Он сохраняет композицию: несколько последовательных мутаций дают суммарное изменение признака, соответствующее их композиции.

Лингвистика: семантический функтор. В категориальной композиционной семантике (DisCoCat) грамматическая структура предложения задаётся категорией предгруппы, а значения слов — векторами в некотором векторном пространстве. Семантический функтор переносит синтаксическую структуру в векторные композиции. Он отображает каждое слово в матрицу или линейную функцию и обеспечивает, что смысл предложения собирается из смыслов слов по законам композиции.

Экономика: агрегирование рынков. Рассмотрим категорию микрорынков, где объекты — отдельные рынки, а стрелки — потоки товаров. Макроэкономическая модель может быть представлена как другая категория с агрегированными секторами. Функтор агрегирования переводит детальную структуру в обобщённую, сохраняя соотношения спроса и предложения. Это позволяет выводить макроповедение из микрооснований.

6.4. Функторы в программировании на Python

Встроенные функторы. Python не является чистым функциональным языком, но многие конструкции ведут себя как функторы. Кроме списков, множество set, словарь dict (отображение по ключам), генераторы — все они поддерживают оператор применения функции к содержимому. Например, map(f, iterable) создаёт итератор, применяя f к каждому элементу, что аналогично действию функтора на морфизм.

Реализация класса-функтора. Мы можем явно создать класс, который реализует интерфейс функтора: у него должен быть метод fmap, принимающий функцию и возвращающий новый объект того же типа с применённой функцией. Например, определим класс Box, который оборачивает значение, и зададим fmap, возвращающий новый Box с преобразованным содержимым. Проверим законы: box.fmap(lambda x: x) вернёт тот же Box, а box.fmap(g).fmap(h) эквивалентно box.fmap(lambda x: h(g(x))).

Пример кода.

-3

Этот пример показывает, как абстрактное математическое понятие реализуется непосредственно в коде, и мы можем проверять законы на конкретных данных.

Функторы и библиотеки. В более продвинутых библиотеках, таких как returns или pymonad, уже есть готовые функторы (Maybe, Either, List). Но мы стремимся к глубокому пониманию, поэтому строим простые версии самостоятельно. Понимание того, что map и fmap — это не просто удобные функции, а носители категориальной структуры, даёт новое видение архитектуры программ.

6.5. Свойства и композиция функторов

-4

Моноидальная структура на категории эндофункторов. Функторы из категории в себя (эндофункторы) можно компоновать друг с другом. Композиция ассоциативна, а тождественный функтор играет роль единицы. Следовательно, эндофункторы на данной категории образуют моноид (точнее, моноид в смысле категории). Эта конструкция лежит в основе понятия монады, с которым мы встретимся позже.

-5

6.6. Задания для самостоятельной работы

  1. Забывающий функтор от колец. Рассмотрите категорию колец (объекты — кольца, стрелки — гомоморфизмы колец). Постройте забывающий функтор в Set, который забывает сложение и умножение, оставляя множество. Проверьте, что он сохраняет тождества и композицию на конкретном примере колец целых чисел и рациональных чисел.
  2. Функтор "вторая производная". Пусть объектами выступают гладкие функции в точке, а стрелками — дифференцирование. Определите функтор, который второй раз дифференцирует, и проверьте, что он действительно функтор: композиция производных сохраняется, тождественная функция даёт тождественную стрелку.
  3. Функтор в Python для типа Option. Создайте класс Maybe (аналог Option), который может содержать либо значение, либо None. Реализуйте метод fmap, который применяет функцию, только если значение не None, иначе возвращает Maybe(None). Докажите на тестах выполнение законов функтора.
  4. Свободный моноид. Покажите, что отображение, берущее множество и возвращающее множество всех конечных строк из его элементов, является функтором из Set в моноиды (категорию моноидов). Как он действует на функции? Проверьте законы.
  5. Функтор в лингвистике. Придумайте простейшую категорию, моделирующую части речи (существительное, глагол), и категорию векторов (векторные пространства). Постройте функтор, который каждому слову сопоставляет вектор его значений, а каждому правилу грамматики — линейную функцию. Объясните, почему это функтор.

6.7. Резюме

Функтор — это отображение между категориями, сохраняющее всю структуру: объекты, стрелки, тождества и композицию. Мы рассмотрели забывающие и свободные функторы, функтор списка в программировании, а также примеры из физики, биологии и лингвистики. Функторы позволяют нам систематически переносить знания из одной области в другую, что является ключом к междисциплинарному синтезу.

Композиция функторов даёт возможность строить сложные переходы между уровнями абстракции. Мы увидели, что функторы сами образуют категорию Cat, а эндофункторы на категории дают начало понятию монады. Эти конструкции будут подробно изучены в следующих уроках.

Python предоставляет прямые аналоги функциональных идей через метод map, классы с fmap и библиотеки. Реализация функторов в коде помогает закрепить математические абстракции и сразу видеть их практическую пользу. Мы написали простой класс Box и убедились, что законы функтора выполняются.

Что дальше? Следующий урок (Урок 7) будет посвящён естественным преобразованиям — морфизмам между функторами. Они позволяют сравнивать разные способы перехода между категориями и закладывают основу для таких важных понятий, как монады и сопряжения.