Теория категорий. Именно об этом часто упоминают те, кто в теме о haskell. Мол многое оттуда.
Поэтому решил разобраться, вникнуть. Возможно, вспомнить школу: ибо в вузе не математикой занимался.
Серьёзную литературу не брал - ограничился википедией.
Первый вопрос, который возник, - что такое категория.
Выяснилось:
категория есть класс объектов, для которого задано множество морфизмов.
Ну, что такое множество - вроде понимаю. Неясными остаются понятия
класс,
объект,
морфизм.
Начну с объекта. Здесь и далее буду проводить аналогии с программированием.
Объект - это область значений (то есть, объект предметной области). Пример: объект натуральных чисел, объект булевых состояний. Область значений - это ни что иное как тип (из мира программирования). Область значений часто ограничена некоторыми рамками. Для бинарной области: 1 и 0 (true или false). Тип - Bool, значения (или экземпляры) - {true, false}.
Далее - морфизм.
Морфизм есть функция. То есть, это отображение f одного пространства (области значений) на другое:
f: A -> B.
Если a in A, b in B, то справедливо f(a) = b.
Класс - множество объектов, обладающих определённым свойством (например, они эквивалентны между собой). По сути класс математики очень похож на тип в программировании. То есть, в haskell, например, можно ввести собственный параметризованный тип:
data Animal sex = Cat sex | Dog sex
data Sex = Male | Female
В общем получается такая картина аналогий (теория категорий -> haskell):
Объект -> тип: 1 | True | Male
Морфизм -> функция: add :: Int -> Int -> Int, add x y = x + y
Класс -> параметризованный тип: data Color a = Red | Green | Blue | RGB a a a
Осталась категория. Если собрать всё вышеизложенное воедино и упростить, то получается, что категория представляет собой тип (или параметризованный тип), для которого задано множество функций. И это понятие соответствует классу (class) языка haskell:
class C a where
f1 :: a Int -> Int
f2 :: a -> Bool
f3 :: a -> C a
Который (этот класс) является интерфейсом, представляющим ограниченное число функций, действующих в рамках заданных типов. Получается, что объект подчиняется морфизмам из числа тех, что определены заданным классом. Здесь
a является именем типа, вакантным местом для пользовательского типа, определяемым уже на этапе реализации класса:
instance C Int where
f1 a b = a `mod` b
f2 i = i > 2
Так, определены уникальные функции f1 и f2 для типа Int. Для других типов функции могут быть реализованы иначе. В целом, классы в haskell - для определения поведения функций в зависимости от типов входных параметров. Это - если совсем просто.