Вы также можете иметь тип кортежа в Javascript.Просто определите его с помощью функций более высокого порядка (академический термин - церковное кодирование):
const Tuple = (...args) => {
const Tuple = f => f(...args);
return Object.freeze(Object.assign(Tuple, args));
};
const get1 = tx => tx((x, y) => x);
const get2 = tx => tx((x, y) => y);
const bimap = f => g => tx => tx((x, y) => Tuple(f(x), g(y)));
const toArray = tx => tx((...args) => args);
// aux functions
const inc = x => x + 1;
const toUpperCase = x => x.toUpperCase();
// mock data
const pair = Tuple(1, "a");
// application
console.assert(get1(pair) === 1);
console.assert(get2(pair) === "a");
const {0:x, 1:y} = pair;
console.log(x, y); // 1 a
console.log(toArray(bimap(inc) (toUpperCase) (pair))); // [2, "A"]
const map = new Map([Tuple(1, "a"), Tuple(2, "b")]);
console.log(map.get(1), map.get(2)); // a b
Обратите внимание, что Tuple
не используется как обычный конструктор.Решение вовсе не опирается на систему-прототип, а исключительно на функции более высокого порядка.
Каковы преимущества кортежей над Array
s, используемых как кортежи?Закодированные церковью кортежи имеют неизменный дизайн и, таким образом, предотвращают побочные эффекты, вызванные мутациями.Это помогает создавать более надежные приложения.Кроме того, проще рассуждать о коде, который различает Array
s как тип коллекции (например, [a]
) и кортежи как связанные данные различных типов (например, (a, b)
).