首页 > 解决方案 > 这个成语是否有一个名称,可以根据先前的值和结果计算新结果?

问题描述

这个“Deriver”习语是否有标准名称(用 Typescript 编写,但不是特定于 Typescript):

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

其中 aderiver是一个函数,它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);
}

标签: typescriptfunctional-programming

解决方案


我的第一个想法是这是一种记忆形式只有一个记忆结果。previous.result但是,如果是这种情况,您只需samePrefix在找到时返回。

相反,看起来您正在做的是创建一种Reduce / Fold函数,该函数能够从先前状态中断的地方恢复。

此模式有许多不同的名称,因此由您决定您认为最适合您的情况的名称。以下是一些建议:

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

推荐阅读