有时会出现一种特殊的计算风格,我不知道如何很好地转换为 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());
这种“在产生相关值的同时累积”功能是否有标准名称?要使用的标准功能?