@KenOKABE Мне все равно, какой синтаксис вы используете для их обозначения, я имею в виду, что число в последовательности и вся последовательность не должны принадлежать к одной и той же категории.

м предыдущем вопросе:

Извлечение данных из цепочки функций без массивов

@Aadit M Shah дал мне удивительное решение следующим образом:

https://stackoverflow.com/a/51420884/6440264

Учитывая выражение какA(a)(b)(f) гдеf это функция, невозможно знать,f должен быть добавлен в список или это функция сокращения. Следовательно, я собираюсь описать, как писать выражения, какA(a)(b)(f, x) что эквивалентно[a, b].reduce(f, x), Это позволяет нам различать, когда список заканчивается, в зависимости от того, сколько аргументов вы предоставили:

const L = g => function (x, a) {
    switch (arguments.length) {
    case 1: return L(k => g((f, a) => k(f, f(a, x))));
    case 2: return g((f, a) => a)(x, a);
    }
};

const A = L(x => x);

const xs = A(1)(2)(3)(4)(5);

console.log(xs((x, y) => x + y, 0));        // 15
console.log(xs((x, y) => x * y, 1));        // 120
console.log(xs((a, x) => a.concat(x), [])); // [1,2,3,4,5]

Работает благодаря продолжениям. Каждый раз, когда мы добавляем новый элемент, мы накапливаем функцию CPS. Каждая функция CPS вызывает предыдущую функцию CPS, тем самым создавая цепочку функций CPS. Когда мы даем этой цепочке функций CPS базовую функцию, она разворачивает цепочку и позволяет нам ее уменьшить. Это та же самая идея позадипреобразователи а такжелинзы.

Для меня осталось 2 вопроса.

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

const isReducer = f => (typeof f === 'function');

Требование предоставить начальное значение имеет предел для свертывания / уменьшения, например, невозможно обеспечить начальное значение для бинарных операций для уменьшения, такого как

const head = (a, b) => a; const tail = (a, b) => b;

(если вы не укажете первое / последнее значение вручную, что не имеет смысла запускать код) Теоретически, каждая двоичная операция имеет значение идентификатора, но что-то невозможно предоставить как есть. Единственный способ - абстрагироваться как личность.

Сказав это, я не могу реорганизовать предоставленный код в отдельные аргументы и по типу функции-редуктора, а также по умолчанию в качестве начального значения последовательности.

Можете ли вы предоставить переработанный код? Также приветствуется любая информация о преобразователе / CPS для этого примера.

Ответы на вопрос(2)

Ваш ответ на вопрос