您将调用T <A> []作为输入并输出T <A []>的函数是什么?

一些例子

const f = <L,R>(xs: Either<L,R>[]): Either<L,R[]> => { throw new Error('Not Implemented') };
const f = <T>(xs: Promise<T>[]): Promise<T[]> => { throw new Error('Not Implemented') };
const f = <T>(xs: Box<T>[]): Box<T[]> => { throw new Error('Not Implemented') };

这些都执行某种还原。但是,这里的半组只是一个列表。

从可读性的角度来看,此类功能的一些好名字。

在这里显然存在一定程度的主观性,因此SO不鼓励这样做。但是,我觉得也可以用一些客观的标准/理由来说一个名字是好是坏。

也许是collectgather的一行?

wobushiren1314 回答:您将调用T <A> []作为输入并输出T <A []>的函数是什么?

TypeScript不是Haskell,但是我通常在那里查看我正在创建的事物的类型是否已有众所周知的名称。

假设Either<L,T>Promise<T>Box<T>T上都applicative functors,则函数签名<L,T>(x: Array<Either<L,T>>) => Either<L,Array<T>>,{{1 }}和<T>(x: Array<Promise<T>>) => Promise<Array<T>>可能被称为sequence

使类型函数<T>(x: Array<Box<T>>) => Box<Array<T>>成为F<T>的应用函子的规则概述:您需要具有一些这样的函数:

T

然后可以像这样实现declare function pure<T>(x: T): F<T>; declare function lift2<A,B,T>(cb: (a: A,b: B) => T): (fa: F<A>,fb: F<B>) => F<T>;

sequence

对于function sequence<T>(x: Array<F<T>>): F<Array<T>> { return x.reduce(lift2<T[],T,T[]>((xs,x) => xs.concat(x)),pure([])) } ,这非常简单:

Promise<T>

您可能还会想出function pure<T>(x: T): Promise<T> { return Promise.resolve(x); } function lift2<A,b: B) => T): (fa: Promise<A>,fb: Promise<B>) => Promise<T> { return (fa: Promise<A>,fb: Promise<B>) => fa.then(a => fb.then(b => cb(a,b))) } Either<L,T>的那些。

好的,希望能有所帮助;祝你好运!

Link to code

本文链接:https://www.f2er.com/3048078.html

大家都在问