【发布时间】:2020-08-18 21:32:47
【问题描述】:
我通常通过箭头语法手动咖喱我的函数。一旦泛型类型参数发挥作用,类型推断似乎就会出现问题:
type Const<A, B> = { const: A };
const Const = <A, B>(x: A): Const<A, B> => ({ const: x });
const map = <F, A, B>(f: (_: A) => B) => (tx: Const<F, B>) => tx;
const inc = (x: number) => x + 1;
const foo = map(inc) (Const("foo")); // Const<unknown, number> instead of <string, number>
当我取消 map 时,一切都按预期工作。如何在不丢失类型推断的情况下保持函数柯里化?
【问题讨论】:
-
type Const<A, B> = { const: A };中的B类型变量有什么意义? -
你当然知道幻象类型。我不是专家,但一个用例是获取值构造函数的正确返回类型,即使此时您没有足够的数据(在给定的示例中,类型构造函数专用于
Const<string, number>)。有时根本没有数据(Nil/List<A>)。我认为Const只是Either的变体,没有Right值构造函数。当然,在一些场景中,它提供了必要的额外多态性。 -
如果您正在探索其他可编译为 JS 的类型安全语言,我强烈建议您查看 OCaml/ReasonML
-
@Thankyou 嗯,我倾向于坚持使用普通人的语言并充分利用它。但是,Ocaml 似乎是一种可爱的语言。
标签: javascript typescript functional-programming type-inference currying