dag*_*da1 3 functional-programming typescript fp-ts
在fp-ts中,它们对更高种类的类型有以下解决方法:
export interface HKT<URI, A> {
readonly _URI: URI;
readonly _A: A;
}
Run Code Online (Sandbox Code Playgroud)
可以这样使用:
export interface Foldable<F> {
readonly URI: F;
reduce: <A, B>(fa: HKT<F, A>, b: B, f: (b: B, a: A) => B) => B;
}
Run Code Online (Sandbox Code Playgroud)
成员_URI是_A什么?成员是什么?
由的作者撰写的这篇文章fp-ts结合TypeScript联合类型的文档很好地解释了。
_A是HKT中值的类型:HKT<"Option", string> => Option<string>。我们将稍后了解映射的工作原理。
_URI是HKT的标识符,例如Option.ts。它有2个实例,None并且Some都"Option"作为_URI。
看一下Fin 的用法,Foldable我们可以看到它与Type类型一起使用A。Type<F, A>。假设是F == "Option" & A == string这样Type<F, A> == Type<"Option", string>,这与Option<string>。当前,我们无法将泛型类型传递给另一个泛型,因为它是泛型参数:<F,A>(fa: F<A>)将无法编译,这是主要问题。
要实现Type<"Option", string> => Option<string>,有几个“映射”接口(本文对此进行了说明)。我们可以Option 在这里看到完成的操作:
declare module './HKT' {
interface URI2HKT<A> {
Option: Option<A>
}
}
最左边Option是一个字符串键,最右边是实际Option类型,毕竟这是一个普通的记录接口。让我们快速看一下的定义Type:type Type<URI extends URIS, A> = URI2HKT<A>[URI]。
URI2HKIT是从我们"Option"到实际的地图Option。允许的是传递2个泛型参数以取回包裹在更高类型的类型中的值类型,从而解决了前面提到的泛型问题。