Currying 函数取消了 OCaml 中的多态性?

Currying function cancels polymorphism in OCaml?

我有一个功能:

 let rec loop size elem =
    if size <= 0 then []
     else elem::( loop (size - 1) elem);;

如果我在 utop 中输入它,我得到了预期的类型 int -> 'a -> 'a list = <fun>,但是如果我创建函数 let loop_3 = loop 3loop_3 的类型变为 '_a -> '_a list = <fun>.与我有关的主要区别在于它将函数从多态函数(其输入为'a)更改为弱多态函数(输入类型为'_a)。为什么会这样?有什么办法可以解决这个问题吗?

要解决此问题,您需要进行 eta 扩展,即提供所有参数。

您看到OCaml 的值限制的结果。在 SO 和 OCaml 的常见问题解答中有很多关于该主题的好答案。我最喜欢的答案之一是 this.