【发布时间】:2019-08-13 09:50:03
【问题描述】:
我有以下功能
[@bs.obj]
external route:
(
~_method: string,
~path: string,
~action: list(string) => unit,
~options: Js.t({..})=?,
unit
) =>
_ =
"";
由于可以部分应用函数,我希望能够做到这一点:
let get = route(~_method="GET");
但它给了我这个错误:
This expression's type contains type variables that can't be generalized:
(~path: string, ~action: list(string) => unit, ~options: {_.. }=?,
unit) =>
{. "_method": string, "action": list(string) => unit,
"options": Js.undefined({.. }), "path": string}
我在这里做错了什么?
【问题讨论】:
-
添加到上面链接的答案中,开放对象类型,无论是否包含在
Js.t中,都包含一个隐式类型变量,因此Js.t({..})是更明确的形式Js.t({..} as 'a)。我的猜测是,编译器不会将与对象关联的类型变量与任何其他类型变量区分开来,因此从它的角度来看,类型变量很可能被ref('a)替换,这可能会导致问题。 -
不太可能会有对编译器内部有深入了解的人来纠正我,这就是为什么我添加了 ocaml 标签来引起他们的注意:)
标签: polymorphism ocaml reason bucklescript value-restriction