Я пишу это как поздний ответ на принятый ответ, так как он неправильный!
Лямбда-исчисление имеет несколько возвращаемых значений, но требуется немного времени, чтобы понять, что означает возвращение нескольких значений.
Лямбда-исчисление не имеет внутреннего определения набора вещей, но оно позволяет вам изобретать его, используя продукты и церковные цифры.
Чистый функциональный JavaScript будет использоваться для этого примера.
давайте определим продукт следующим образом:
const product = a => b => callback => callback(a)(b);
тогда мы можем определить church_0 и church_1, иначе true, false, иначе слева, справа, иначе car, cdr, иначе first, остальные следующим образом:
const church_0 = a => b => a;
const church_1 = a => b => b;
давайте начнем с создания функции, которая возвращает два значения, 20 и «Hello».
const product = a => b => callback => callback(a)(b);
const church_0 = a => b => a;
const church_1 = a => b => b;
const returns_many = () => product(20)("Hello");
const at_index_zero = returns_many()(church_0);
const at_index_one = returns_many()(church_1);
console.log(at_index_zero);
console.log(at_index_one);
Как и ожидалось, мы получили 20 и «Hello».
Toвернуть более 2 значений, это немного сложнее:
const product = a => b => callback => callback(a)(b);
const church_0 = a => b => a;
const church_1 = a => b => b;
const returns_many = () => product(20)(
product("Hello")(
product("Yes")("No")
)
);
const at_index_zero = returns_many()(church_0);
const at_index_one = returns_many()(church_1)(church_0);
const at_index_two = returns_many()(church_1)(church_1)(church_0);
console.log(at_index_zero);
console.log(at_index_one);
console.log(at_index_two);
Как видите, функция может возвращать произвольное количество возвращаемых значений, но для доступа к этим значениям вы не можете просто использовать результат () [0], результат () [1], или result () [2], но вы должны использовать функции, которые отфильтровывают нужную вам позицию.
Это потрясающе похоже на электрические цепи, в которых схемы не имеют "0", "1 "," 2 "," 3 ", но у них есть средства для принятия решений, и путем абстрагирования нашей схемы с помощью байта (обратный список из 8 входов), слова (обратный список из 16 входов) на этом языке 0в качестве байта будет [0, 0, 0, 0, 0, 0, 0, 0], что эквивалентно:
const Byte = a => b => c => d => e => f => g => h => callback =>
callback(a)(b)(c)(d)(e)(f)(g)(h);
const Byte_one = Byte(0)(0)(0)(0)(0)(0)(0)(1); // preserves
const Bit_zero = Byte_one(b7 => b6 => b5 => b4 => b3 => b2 => b1 => b0 => b0);
После изобретения числа мы можем сделать алгоритм, учитываяИндекс байтового массива и байт, представляющий индекс, который мы хотим получить из этого массива, позаботятся о шаблоне.
В любом случае, то, что мы называем массивами, - не что иное, как следующее, выраженное на более высоком уровне, чтобы показатьpoint:
// represent nested list of bits(addresses)
// to nested list of bits(bytes) interpreted as strings.
const MyArray = function(index) {
return (index == 0)
? "0th"
: (index == 1)
? "first"
: "second"
;
};
за исключением того, что он не выполняет 2 ^ 32 - 1 if операторов, он делает только 8 и рекурсивно сужает конкретный элемент, который вы хотите.По сути, он действует точно так же, как мультиплексор (за исключением того, что «одиночный» сигнал на самом деле является фиксированным числом битов (копроизведений, вариантов выбора), необходимых для уникальной адресации элементов).
Моя точка зрения заключается в том, что массивы, карты, ассоциативные массивы, списки, биты, байты, слова - это все основные функции, как на уровне цепей (где мы можем представлять сложные вселенные только с помощью проводов и переключателей),и математический уровень (где все в конечном счете является продуктами (последовательностями, сложными в управлении без необходимости вложения, например списками), копроизведениями (типами, наборами) и экспонентами (свободные функторы (лямбды), функторы забвения)).