Является ли копродукт тем же, что и суммы?

Я смотрел эту лекцию у Бартоша Милевского, и он объяснял типы копроизведений и сумм.

На лекции он перешел от одного к другому.

Является ли копродукт тем же, что и тип суммы?

Ответ 1

В принципе, да. Копродукт в принципе более общий, но это не обязательно касается вас, насколько это касается Haskell.

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

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

type LFun v w = v -> w

initial :: VectorSpace w => LFun () w
initial () = zeroV

(+++) :: VectorSpace w => LFun u w -> LFun v w -> LFun (u,v) w
(f+++g) (u,v) = f u ^+^ g v

(Стандартным продуктом этой категории является тензорное произведение, хотя можно игнорировать это и использовать обычные кортежи как тип продукта, т.е. Фактические копроизведения. Я думаю, это связано с тем, что любое гильбертово пространство изоморфно его двойное пространство. В моей библиотеке linearmap-category constrained-categories/linearmap-category продукты являются кортежами, тогда как Майк Избицкий не сделал этого в подобной в то же SubHask библиотеке SubHask.) См. Комментарий Дерека Элкинса.


Я понимаю "тип суммы" в смысле данных, т.е. Как алгебраический тип данных со структурой меченого союза.