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