来自fp-ts和URI的打字稿中更高的kinded类型

时间:2018-04-14 07:10:08

标签: typescript functional-programming fp-ts

在fp-ts中,他们为更高级别的类型提供了这种解决方法:

export interface HKT<URI, A> {
  readonly _URI: URI;
  readonly _A: A;
}

它可以像这样使用:

export interface Foldable<F> {
  readonly URI: F;
  reduce: <A, B>(fa: HKT<F, A>, b: B, f: (b: B, a: A) => B) => B;
}

哪些成员_URI以及什么是_A

1 个答案:

答案 0 :(得分:4)

fp-ts的作者

This article written结合TypeScript's union types上的文档很好地解释了。

_A是我们的HKT中的值的类型:HKT<"Option", string> => Option<string>。我们将稍后了解映射的工作原理。

_URI是HKT的标识符,例如Option.ts。它有两个实例,NoneSome,它们的"Option"都以_URI为例。

Taking a look at the usage of F in 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 here已完成:

declare module './HKT' { interface URI2HKT<A> { Option: Option<A> } }

最左边的Option是一个字符串键,最右边的是实际的Option类型,毕竟这是一个普通的记录接口。让我们快速浏览一下Typetype Type<URI extends URIS, A> = URI2HKT<A>[URI]的定义。

URI2HKIT是从我们的"Option"到我们实际的Option的映射。允许的是传递2个泛型参数以取回包裹在更高类型的类型中的值类型,从而解决了前面提到的泛型问题。