к
(Type, |, empty)то есть мы можем суммировать любые типы, empty/never - нейтральный элемент (то есть
x | empty = x = empty | x)у нас есть дуальный моноид
(Type, Pair, void)мы можем перемножать (делать кортежи) любых типов, при этом
[x, void] = x = [void, x] есть дистрибутивность:
[(a | b), c] = [a, c] | [b, c]есть закон закон пересечения моноидов:
x * empty = empty = empty * xвсе это можно понять, если заменить операции и значения на привычные тебе:
| = +
[,] = *
empty = 0
void = 1
