小编Ada*_* B.的帖子

在折叠/归约后执行一次函数的函数式编程模式?

我是函数式编程的新手,想知道是否存在任何形式的正式模式/数据类型,其中 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)

像这样的图案有名字吗?

functional-programming typescript

13
推荐指数
2
解决办法
1865
查看次数

RxJS mixLatest 每个路径仅发出一次

是否有任何方法/模式可以使用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)

javascript rxjs rxjs-marbles

5
推荐指数
1
解决办法
412
查看次数

Typescript 将键数组映射到属性数组

我想做这样的事情:

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()类型级别的东西吗?

typescript

2
推荐指数
1
解决办法
74
查看次数