在产生相关值的同时进行迭代累积的标准函数

本文关键字:迭代 函数 标准 | 更新日期: 2023-09-27 18:14:59

有一种特殊的计算方式不时出现,我不知道如何很好地转化为map/filter/reduce。我想知道是否有一个标准的函数式函数来完成它,或者什么是一个好名字。

基本上,你会发现自己在每一站都听从指示,同时放弃东西。下面是一个c#函数,展示了总体思路:

public static IEnumerable<TOut> streamAggregateMap<TDif, TAcc, TOut>(
        this IEnumerable<TDif> difs,
        TAcc seed,
        Func<TAcc, TDif, TAcc> accumulator,
        Func<TAcc, TDif, TOut> selector) {
    var acc = seed;
    foreach (var dif in difs) {
        yield return selector(acc, dif);
        acc = accumulator(acc, dif);
    }
}

您可以使用它来跟踪树,同时生成值:

var vals = goLeftDirections.streamAggregateMap(
    root,
    (node, goLeft) => goLeft ? node.left : node.right,
    (node, goLeft) => node.value);

或者告诉你迭代地乘以2并加上一些偏移量得到的数的质因数分解,除了这些因数分解是不乘以2的偏移量的数:

var factorizations = offsets.streamAggregateMap(
    1,
    (total, offset) => total * 2 + offset,
    (total, offset) => (total + offset).Factorize());

这个"在产生相关值的同时积累"功能是否有一个标准名称?要使用的标准函数?

在产生相关值的同时进行迭代累积的标准函数

MoreLINQ将此操作称为Scan.