Это вторая статья из серии «Теория категорий для программистов».
Категория – это очень простая концепция.
Категория состоит из объектов и стрелок, указывающих между ними.
Вот почему категории так легко представить графически.
Объект можно нарисовать в виде круга или точки, а стрелки — это просто стрелки между ними.
(Для разнообразия я иногда рисую такие предметы, как свиньи, и стрелы, как фейерверки.
) Но суть категории — в композиции.
Или, если хотите, сущностью композиции является категория.
Стрелки устроены так, что если у вас есть стрелка от объекта А к объекту Б, а другая стрелка от объекта Б к С, то должна быть стрелка — их композиция — от А к С.
В категории, если есть стрелка от А к Б и стрелка от Б к С, то должна быть и стрелка от А к С, что называется их композицией.
Эта схема не является полным определением категории, поскольку тождественных морфизмов недостаточно (см.
ниже).
Стрелки как функции
Уже слишком много абстрактной чепухи? Не отчаивайся.Давайте посмотрим на примеры.
Думайте о стрелках, также называемых морфизмами, как о функциях.
У вас есть функция f, которая принимает аргумент типа A и возвращает значение типа B. Затем у вас есть другая функция g, которая принимает B и возвращает C. Вы можете объединить их, передав результат из f в g. Вы только что описали новую функцию, которая принимает A и возвращает C. В математике такая композиция обозначается маленьким кружочком между функциями: g∘f. Обратите внимание на порядок композиции справа налево.
Это сбивает с толку некоторых людей.
Вы можете увидеть сходство с обозначениями каналов в Unix, например:
или композиция > > в F#, оба из которых идут слева направо.lsof | grep Chrome
Но в математике и функциях 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 #Функциональное программирование
-
Что Делает Ключевые Слова Отличными?
19 Oct, 24 -
Тонкие Клиенты Такие, Какие Они Есть
19 Oct, 24 -
Centos 7 Конвертируется В Программный Raid 1
19 Oct, 24 -
Пусть Тесты Подтвердят Себя Сами
19 Oct, 24