Есть ли название для этой идиомы, которая вычисляет новый результат на основе предыдущего значения и результата?

#typescript #functional-programming

#typescript #функциональное программирование

Вопрос:

Существует ли стандартное название для этой идиомы «Производной» (написанной на Typescript, но не специфичной для Typescript):

 type Derivation<T, R> = { value: T, result: R };
type Deriver<T, R> = (
    previous: Derivation<T, R> | undefined,
    value: T
) => R;
  

где a deriver — это функция, которая вычисляет новое значение R , используя предыдущее значение / результат в качестве подсказки для потенциальной оптимизации нового вычисления?

Вот пример такой функции:

 function complexCalculation(a: number, b: number): number {
    // assume that this function is expensive
    return a   b;
}

function calcDeriver(
    previous: Derivation<number[], number> | undefined,
    value: number[]
): number {
    if (previous) {
        if (previous.value === value) {
            return previous.result;
        }
        let samePrefix = true;
        if (previous.value.length < value.length) {
            for (let i = 0; i < previous.value.length; i  ) {
                if (previous.value[i] !== value[i]) {
                    samePrefix = false;
                    break;
                }
            }
        }
        if (samePrefix) {
            return value
                .slice(previous.value.length)
                .reduce(complexCalculation, previous.result);
        }
    }

    return value.reduce(complexCalculation, 0);
}
  

Комментарии:

1. Можете ли вы привести пример того, как это используется / реализовано?

2. Конечно — добавлено в описание.

3. Императивное программирование? Динамическое программирование? Запоминание?

4. Как вы вызываете calcDeriver ? Эта функция не имеет никакого смысла.

Ответ №1:

Моей первой мыслью было, что это форма запоминания только с одним сохраненным в памяти результатом. Однако, если бы это было так, вы бы просто вернули, previous.result если samePrefix было найдено.

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

Для этого шаблона существует много разных имен, поэтому вам решать, что, по вашему мнению, лучше всего подходит в вашем случае. Вот несколько предложений:

  • Reduction / Reducer
  • FoldResult / Folder
  • Aggregation / Aggregator

Комментарии:

1. шаблон, который действительно описывается здесь, выполняется в .reduce(complexCalculation, previous.result), 1 к этому ответу