OCaml 是否支持显式类型应用?

Does OCaml support explicit type application?

许多语言允许显式指定泛型函数的类型参数。

例如,如果我们在 Java 或 TypeScript 中有一个具有以下签名的函数:

void f<T>();

…和类型 MyType,我们可以写 f<MyType>() 来调用 f,类型参数 T 显式指定为 MyType.

OCaml 有这个功能吗?

如果答案是否定的——这是因为OCaml的类型推断太强以至于永远不会出现类型应用有用的情况吗?

OCaml 没有特别的多态性。也就是说,您不能让函数根据给定的参数类型或预期的参数类型 return 表现不同。因此,您在 Java/TypeScript 中给出的示例在 OCaml 中根本不合理。

此外,OCaml 允许对任何表达式进行类型注释。因此,不需要专门针对函数应用程序的独特语法。例如,要注释 return 类型的函数应用程序,您可以执行 (f (): my_type)let x: my_type = f () in ...

OCaml 类型推断是五个异常(GADT、higher-rank 多态性、higher-order 标记函数、递归多态性和 type-directed 消歧)之外的主要类型。这意味着类型检查器推断的类型始终是最通用的可能类型,并且向某些 OCaml 程序添加类型注释只能将 well-typed 程序转换为 ill-typed 程序,反之则不可能。 (再次超出前面提到的高级子集)。

特别是函数应用的类型是主要的,f x的类型总是可以推断的。

因此,在编写应用程序时向函数提供显式类型参数 à la System F 既不需要也无用。