9

在 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

4

1 回答 1

10

这篇文章的作者写的fp-ts很好,结合TypeScript的联合类型的文档说明了。

_A是我们 HKT: 中值的类型HKT<"Option", string> => Option<string>。我们稍后会看到映射是如何工作的。

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

看一下 in 的用法,F我们Foldable可以看到它与;Type一起用于类型中。. 假设如此,这与 非常相似。目前,我们不能将泛型类型传递给另一个泛型,因为它是泛型参数:不会编译,这是主要问题。AType<F, A>F == "Option" & A == stringType<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 个泛型参数来取回包装在更高种类类型中的值类型,从而解决前面提到的泛型问题。

于 2018-07-01T15:26:30.127 回答