#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 к этому ответу