Категория: Суть Композиции

Это вторая статья из серии «Теория категорий для программистов».

Категория – это очень простая концепция.

Категория состоит из объектов и стрелок, указывающих между ними.

Вот почему категории так легко представить графически.

Объект можно нарисовать в виде круга или точки, а стрелки — это просто стрелки между ними.

(Для разнообразия я иногда рисую такие предметы, как свиньи, и стрелы, как фейерверки.

) Но суть категории — в композиции.

Или, если хотите, сущностью композиции является категория.

Стрелки устроены так, что если у вас есть стрелка от объекта А к объекту Б, а другая стрелка от объекта Б к С, то должна быть стрелка — их композиция — от А к С.



Категория: суть композиции

В категории, если есть стрелка от А к Б и стрелка от Б к С, то должна быть и стрелка от А к С, что называется их композицией.

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

ниже).



Стрелки как функции

Уже слишком много абстрактной чепухи? Не отчаивайся.

Давайте посмотрим на примеры.

Думайте о стрелках, также называемых морфизмами, как о функциях.

У вас есть функция f, которая принимает аргумент типа A и возвращает значение типа B. Затем у вас есть другая функция g, которая принимает B и возвращает C. Вы можете объединить их, передав результат из f в g. Вы только что описали новую функцию, которая принимает A и возвращает C. В математике такая композиция обозначается маленьким кружочком между функциями: g∘f. Обратите внимание на порядок композиции справа налево.

Это сбивает с толку некоторых людей.

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

  
  
  
  
   

lsof | grep Chrome

или композиция > > в F#, оба из которых идут слева направо.

Но в математике и функциях Haskell композиция осуществляется справа налево.

Будет полезно, если вы прочтете g∘f как «g после f».

Давайте покажем это еще яснее на примере кода C. У нас есть одна функция f, которая принимает аргумент типа A и возвращает значение типа B:

B f(A a);

и другой:

C g(B b);

Их сочетание будет:

C g_after_f(A a) { return g(f(a)); }

Здесь вы снова видите композицию справа налево: g(f(a));, теперь на C. Хотел бы я вам сказать, что в стандартной библиотеке C++ есть шаблон, который принимает две функции и возвращает их композицию, но такого нет. Примечание переводчика: но это несложно написать на C++14 (я опускаю кучу деталей владения и магию шаблонов, чтобы проверить, что эти функции и типы аргументов действительно могут быть составлены):

template <typename T> struct function_arg: public function_arg<decltype(&T::operator())> {}; template<typename ReturnType, typename Arg> struct function_arg<ReturnType(Arg) const> {

Теги: #Функциональное программирование #теория категорий #haskell #C++ #программирование #C++ #haskell #Функциональное программирование

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.