Прошел пару первых уроков из курса «составные данные»: Первый учит моделировать объекты типа «точка на плоскости».

Для работы с точками на плоскости объявляются функция-конструктор makePoint и две функции-селектора getX и getY. Конструктор принимает два аргумента: x и y, которые соответствуют координатам точки и возвращает объект, который эту точку олицетворяет. Селекторы наоборот, принимают объект-точку и возвращают число, соответствующее координате x или y этой точки.

Вот так, например, создается точка, которая лежит в начале координат:

const point = makePoint(0, 0)

Если хотим посмотреть, какая у точки координата x, то используем соответствующий селектор:

const x = getX(point)

Теперь можно позадавать разные операции над точками. Вот, например, функция, которая получив любую точку возвращает новую точку, отраженную относительно оси X:

const symmetricalXPoint = (point) => makePoint(getX(point), getY(point))

Может возникнуть вопрос, а зачем все эти конструкторы и селекторы? Нельзя использовать обычные числовые константы для работы с этими точками? Можно, если захотеть. Для примера, возьмем задачу найти середину между двумя точками: (1, 1) и (3, 7). Решение просто на числах будет выглядеть примерно так:

// первая точка
const x1 = 1;
const y1 = 1;

// вторая точка
const x2 = 3;
const y2 = 7;

// точка между первой и второй
const x3 = middle(x1, x2);
const y3 = middle(y1, y2);

То же самое, но используя тип данных для точки:
const p1 = makePoint(1, 1);
const p2 = makePoint(7, 3);
const p3 = middle(p1, p2);

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

В следующем посте о том, как реализовать функции makePoint, getX и getY.