1

有时会出现一种特殊的计算风格,我不知道如何很好地转换为 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());

这种“在产生相关值的同时累积”功能是否有标准名称?要使用的标准功能?

4

1 回答 1

0

MoreLINQ 将此操作称为Scan

于 2014-07-25T19:29:35.773 回答