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

Теория категорий для кулинаров. Глава 1. Суть композиции.

Категория — это до смешного простая концепция. Представьте себе, что категория — это просто набор ингредиентов и действий, которые мы с ними совершаем. В нашей кулинарной книге категория состоит из объектов (продуктов или готовых блюд) и стрелок (действий или рецептов), которые преобразуют один объект в другой. Объект можно нарисовать как морковку, кусок мяса или тарелку готового супа. А стрелка... это стрелка (или, если хотите, кулинарный прием: нарезка, варка, жарка). Но суть кулинарии, как и суть категории, — это композиция. Или, если хотите, суть композиции — это категория. Действия (стрелки) можно объединять в последовательности: если у вас есть действие, превращающее объект А (скажем, сырая картошка) в объект Б (вареная картошка), и другое действие, превращающее Б (вареная картошка) в объект В (картофельное пюре), то обязательно должно существовать их композиция — составное действие, которое превращает А сразу в В. Не кажется ли вам это слишком абстрактным? Не отчаивайтесь. Да
Оглавление

Категория — это до смешного простая концепция. Представьте себе, что категория — это просто набор ингредиентов и действий, которые мы с ними совершаем. В нашей кулинарной книге категория состоит из объектов (продуктов или готовых блюд) и стрелок (действий или рецептов), которые преобразуют один объект в другой.

Объект можно нарисовать как морковку, кусок мяса или тарелку готового супа. А стрелка... это стрелка (или, если хотите, кулинарный прием: нарезка, варка, жарка). Но суть кулинарии, как и суть категории, — это композиция. Или, если хотите, суть композиции — это категория. Действия (стрелки) можно объединять в последовательности: если у вас есть действие, превращающее объект А (скажем, сырая картошка) в объект Б (вареная картошка), и другое действие, превращающее Б (вареная картошка) в объект В (картофельное пюре), то обязательно должно существовать их композиция — составное действие, которое превращает А сразу в В.

1.1 Стрелки как рецепты

Не кажется ли вам это слишком абстрактным? Не отчаивайтесь. Давайте говорить конкретно. Думайте о стрелках (их еще называют морфизмами) как о простых шагах в рецепте или превращениях ингредиентов на вашей кухне.

У вас есть действие f: взять ингредиент типа "Яйцо" (объект А) и разбить его в миску, получив объект "Яичная смесь" (объект Б).

f(Яйцо) = Яичная смесь

У вас есть другое действие g: взять "Яичную смесь" (объект Б) и пожарить её на сковороде, получив "Яичницу" (объект В).

g(Яичная смесь) = Яичница

В нашей кулинарной категории, если есть стрелка от А к Б и стрелка от Б к В, то должна быть и прямая стрелка от А к В, которая является их композицией. На этой схеме не хватает только тождественных действий (об этом позже).

Вы можете легко скомпоновать эти действия, передав результат первого шага (f) на вход второму (g). Вы только что создали новый, составной рецепт, который берет сырое яйцо и сразу дает яичницу.

В кулинарной нотации мы бы записали это как g после f. Сначала делаем f (разбиваем), потом g (жарим). Обратите внимание на порядок справа налево: мы читаем g ◦ f как g после f. Это как следовать рецепту сверху вниз: первый шаг, потом второй.

В жизни это выглядит так:

  1. Шаг f: Достать яйцо из холодильника (объект А) и разбить в миску (объект Б).
  2. Шаг g: Взять миску со смесью (объект Б) и вылить на сковороду (объект В).

Результат: вы сделали яичницу, просто выполнив шаги последовательно. В этом и заключается суть композиции.

1.2 Свойства Композиции

Есть два очень важных свойства, которым должна удовлетворять композиция в любой категории (и на любой кухне).

1. Композиция ассоциативна. Если у вас есть три действия — f, g и h, которые можно выполнить последовательно (их ингредиенты совпадают), то не имеет значения, как вы расставите скобки, группируя действия.
Представьте, что вы готовите сложное блюдо:

  • f: Нарезать овощи (А → Б).
  • g: Обжарить нарезанные овощи (Б → В).
  • h: Добавить бульон и сварить суп (В → Г).

Ассоциативность означает, что неважно, сначала ли вы скомпонуете нарезку и обжарку (g ◦ f), а потом варку (h ◦ (g ◦ f)), или сначала скомпонуете обжарку и варку (h ◦ g), а потом примените это к нарезке ((h ◦ g) ◦ f). Результат — суп — будет одинаковым.
На кухне это просто означает, что процесс приготовления можно мысленно разбивать на этапы в любом порядке, главное — соблюдать последовательность шагов. Сначала нарезка, потом жарка, потом варка — и никак иначе. Скобки не важны, важна последовательность.

2. Для каждого объекта существует стрелка, которая является единицей композиции. Эта стрелка ведет от объекта к самому себе. В кулинарии это действие, которое ничего не меняет. Для объекта "Помидор" это действие "оставить помидор как есть" или "положить помидор на тарелку, не изменяя его". Звучит глупо? Но это очень важно!
Эта стрелка называется
тождественным действием (id для объекта А).
В математических обозначениях: если f превращает помидор в салат (А → Б), то:

  • Сделать салат из помидора после того, как мы ничего не сделали с помидором (f ◦ id), — это то же самое, что просто сделать салат (f).
  • Ничего не сделать с салатом после того, как мы его приготовили (id ◦ f), — это тоже то же самое, что просто приготовить салат (f).

Тождественное действие — это как ноль в математике. Зачем он нужен, если он ничего не значит? Ноль позволил арабам и персам развить алгебру, которой не могли заниматься римляне. Точно так же тождественное действие (например, "оставить ингредиент в покое" или "просто подать блюдо") позволяет нам строить общие схемы и абстрактные рецепты. Оно становится "пустым" действием в более сложных кулинарных техниках.

Итог: Кулинарная категория состоит из ингредиентов (объекты) и действий (стрелки). Действия можно компоновать (делать последовательно), и эта композиция ассоциативна. Для каждого ингредиента есть "пустое" действие — оставить его как есть, которое является нейтральным элементом композиции.

1.3 Композиция — это cуть готовки

Шеф-повара подходят к созданию блюд очень своеобразно. Они начинают с философских вопросов. Например, создавая новое десертное меню, они спрашивают: "Что такое идеальный десерт?". А реализуя сложное банкетное блюдо, они задумываются о балансе вкусов.

В том же ключе спросим: что такое приготовление еды? На самом базовом уровне — это просто следование инструкциям: "Нарежь лук, брось на сковороду, посоли". Но даже когда мы просто варим пельмени, наши действия — это выражение чего-то большего. Мы решаем нетривиальную задачу (если бы она была тривиальной, мы бы просто заказали доставку). И как мы решаем кулинарные задачи? Мы разбиваем большие проблемы на маленькие. Если маленькие задачи все еще сложны, мы дробим их дальше. В итоге мы осваиваем все маленькие шаги: чистка овощей, правильная нарезка, варка бульона, пассеровка лука.

И вот тут появляется суть готовки: мы компонуем эти маленькие шаги в последовательности, чтобы создать решения для больших задач — полноценные блюда. Декомпозиция (разделение на шаги) не имела бы смысла, если бы мы не могли собрать всё обратно в единый рецепт.

Этот процесс иерархического разделения и компоновки нужен не кухне, а нам самим. Наш мозг может одновременно удерживать лишь ограниченное число операций. Мы не можем уследить за всеми 20 кастрюлями сразу. Нам нужна структура рецепта не потому, что структурированные рецепты приятно читать, а потому что иначе наш мозг просто не справится с готовкой. Элегантный рецепт — это тот, который легко "переварить" нашему уму: он разбит на логичные, понятные блоки (подготовка, основа, финиш), и этих блоков ровно столько, сколько мы можем запомнить.

Что же такое эти "правильные блоки" в кулинарии? Их "внешняя сложность" (что нужно знать повару, чтобы использовать блок) должна расти медленнее, чем их "внутренняя сложность" (что внутри блока). Как только блок (например, "приготовить классический соус бешамель") освоен, мы можем забыть о его внутренностях (постоянное помешивание, пропорции муки и масла) и сосредоточиться на том, как он взаимодействует с другими блоками — например, с пастой или лазаньей.

Теория категорий в этом смысле экстремальна: она предлагает нам вообще не заглядывать внутрь объектов. Для неё объект — это абстрактная сущность. Всё, что мы можем о нём знать — это как он связан с другими объектами. Это как ресторанный критик: его интересует не то, как именно шеф-повар чистил грибы (внутренняя кухня), а то, как грибное блюдо сочетается с соусом и гарниром (связи с другими объектами на тарелке). В идеальной кулинарной книге рецепт виден только через его абстрактное описание (список ингредиентов и время готовки), а методы играют роль стрелок. Как только вам нужно лезть в дебри технологии, чтобы понять, как соединить этот соус с этим мясом, вы теряете преимущества хорошей кулинарной системы.

1.4 Кулинарные упражнения: три взгляда на яйцо

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

Подготовительный этап (общий для всех): работа с объектом «Яйцо»

Прежде чем строить стрелки, нужно убедиться в качестве исходного объекта. В нашей категории объект «Яйцо» должен быть свежим и иметь комнатную температуру (для пашота и яичницы это критично). Введём две вспомогательные стрелки:

  • Проверка свежести (test) : Опустите яйцо в миску с холодной водой. Свежее яйцо ляжет на дно (переходим к объекту «Свежее яйцо»). Если всплывёт — объект не пригоден к дальнейшим преобразованиям (в нашей категории такой объект исключается, отправляйтесь в магазин за новым).
  • Термостатирование (temper) : Достаньте яйцо из холодильника и оставьте при комнатной температуре на 30–60 минут. Это стрелка temper: Яйцо\_холодное → Яйцо\_комнатное. Для простоты будем считать, что мы всегда начинаем с объекта «Яйцо комнатной температуры свежее», если не оговорено иное.

Теперь перейдём к блюдам.

1. Яйцо вкрутую (композиция простых нагревов)

Объекты:

  • A = «Яйцо комнатной температуры»
  • B = «Яйцо в кипящей воде» (промежуточный)
  • C = «Яйцо вкрутую»

Стрелки:

  • f: A → B — погрузить яйцо в кипящую подсоленную воду (1 столовая ложка соли на литр воды — это предохраняет скорлупу от растрескивания).
  • g: B → C — варить ровно 10 минут после закипания. Затем немедленно переложить в ледяную воду (остановка нагрева, чтобы желток не потемнел). Это составная стрелка: собственно варка + охлаждение.

Композиция g ◦ f даёт полный рецепт: из A сразу получаем C. Ассоциативность проверяется тривиально: если бы мы разбили варку на два этапа (первые 5 минут и вторые 5), результат был бы тем же. Тождественное действие — просто подержать яйцо в руке перед варкой (ничего не меняет). Убедитесь, что яйцо именно вкрутую: желток и белок полностью твёрдые.

2. Яйцо пашот (стрелка с параметрами)

Приготовление пашота требует дополнительных объектов и тонкой настройки стрелки.

Объекты:

  • A = «Яйцо комнатной температуры»
  • B = «Яйцо, выпущенное в миску» (без скорлупы)
  • C = «Яйцо пашот»

Стрелки:

  • split: A → B — аккуратно разбить яйцо и вылить в миску, сохраняя желток целым. Это не просто разбить, а именно подготовить к пашот.
  • poach: B → C — выпустить яйцо из миски в кипящую воду с уксусом и солью (1 столовая ложка 9% уксуса и 1 чайная ложка соли на литр воды). Варить 3–4 минуты (чем свежее яйцо, тем компактнее форма). Вынуть шумовкой.

Композиция poach ◦ split даёт готовое яйцо пашот. Обратите внимание: уксус и соль — параметры стрелки poach. Без них белок расползётся, и объект «Яйцо пашот» не получится — вместо него будет объект «Яичная каша». В категории это означает, что стрелка poach определена только при наличии этих параметров (как рецепт требует точных ингредиентов). Также важно, что яйцо должно быть комнатной температуры, иначе время варки увеличится, а результат может отличаться — это влияние предыдущей стрелки temper. Если мы включим temper в композицию: poach ◦ split ◦ temper, то получим рецепт, который начинается с холодного яйца из холодильника.

3. Яичница-глазунья (проверка тождественности)

Объекты:

  • A = «Яйцо комнатной температуры»
  • B = «Яйцо, разбитое на сковороду»
  • C = «Глазунья»

Стрелки:

  • crack: A → B — разбить яйцо и вылить на разогретую сковороду с маслом.
  • fry: B → C — жарить на медленном огне 3–5 минут до желаемой степени готовности желтка (если любите жидкий — меньше, если твёрдый — дольше). Посолить щепоткой соли в конце.

Композиция fry ◦ crack — классическая яичница. А теперь проверим свойство тождественности. Введём стрелку id_A: «ничего не делать с яйцом А» (просто оставить его лежать). Тогда fry ◦ crack ◦ id_A должно дать тот же результат, что и fry ◦ crack. Проделайте эксперимент: возьмите два одинаковых яйца, одно сразу разбейте и пожарьте, другое сначала подержите в руке 10 секунд (id), а потом разбейте и пожарьте. Результат будет идентичным (при условии, что яйца одинаковой температуры). Это иллюстрирует, что тождественная стрелка не влияет на композицию. Разумеется, если вместо id_A вы подержите яйцо в холодильнике лишний час, это уже другая стрелка (охлаждение), и результат может измениться.