我是函数式编程的新手,想知道是否存在任何形式的正式模式/数据类型,其中 1)我们用幺半群折叠/减少,2)运行一次函数以从减少的值中获取一些摘要。例如,为了获得数组的平均值,我们可以归约为一个[count, sum]元组,然后在归约完成后将总和除以计数。这是我在 TypeScript 中的实现(空数组会爆炸):
const reduceSummarize = <T, U, V>(
array: T[],
reducefn: (result: U, nextValue: T) => U,
initialValue: U,
afterfn: (result: U) => V
) => {
return afterfn(array.reduce(reducefn, initialValue));
};
const incrementCountSum = (
countSumTuple: [number, number],
nextValue: number
): [number, number] => [countSumTuple[0] + 1, countSumTuple[1] + nextValue];
const tupleRatio = (tuple: [number, number]) => tuple[1] / tuple[0];
reduceSummarize([1, 2, 3, 4], incrementCountSum, [0, 0], tupleRatio) // 2.5
Run Code Online (Sandbox Code Playgroud)
像这样的图案有名字吗?
是否有任何方法/模式可以使用combineLatest()或其他一些运算符,以便如果组合的可观察量相互依赖,则它们对于 DAG 中具有相同原点的每组路径仅发出一次?我想用图可能更容易解释。
图表:
A C
/| |
B | |
\|/
D
Run Code Online (Sandbox Code Playgroud)
这里 B 订阅了 A,D 订阅了 A、B 和 C。默认行为是,如果 A 发出,D 发出两次:当 A 发出时一次,当 B 发出时再一次(由于 A 发出) )。我希望它在两者都发射后只发射一次。然而,如果 C 发出,那么 D 也应该立即发出。
这是代码:
const A = new Rx.BehaviorSubject(1);
const B = A.pipe(Rx.map((x) => x + 1));
const C = new Rx.BehaviorSubject(3);
const D = Rx.combineLatest({ A, B, C });
D.subscribe(console.log); // {A: 1, B: 2, C: 3}
A.next(2); // Two emissions: …Run Code Online (Sandbox Code Playgroud) 我想做这样的事情:
type A = { a: string; b: number; c: boolean };
type B = ["b", "a"];
type C = MapProps<A, B> ?? // [number, string]
Run Code Online (Sandbox Code Playgroud)
我能得到的最接近的是:
type C = {[key in B[number]]: A[key]}
Run Code Online (Sandbox Code Playgroud)
但这会产生一个对象,而我想丢弃键并仅将值保留为元组,其顺序与B. 即,有Object.values()类型级别的东西吗?