这个习惯用法是否有名称,可以根据先前的值和结果来计算新结果?

时间:2019-03-13 17:36:45

标签: typescript functional-programming

此“ Deriver”惯用语是否有标准名称(用Typescript编写,但不是Typescript专用):

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

其中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 个答案:

答案 0 :(得分:1)

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

相反,您正在执行的操作似乎是创建一种Reduce / Fold函数,该函数能够从先前状态中断的地方继续工作。

此模式有许多不同的名称,因此由您自己决定最适合您的情况的模式。这里有一些建议:

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