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 3
,loop_3
的类型变为 '_a -> '_a list = <fun>
.与我有关的主要区别在于它将函数从多态函数(其输入为'a
)更改为弱多态函数(输入类型为'_a
)。为什么会这样?有什么办法可以解决这个问题吗?
要解决此问题,您需要进行 eta 扩展,即提供所有参数。
您看到OCaml 的值限制的结果。在 SO 和 OCaml 的常见问题解答中有很多关于该主题的好答案。我最喜欢的答案之一是 this.
我有一个功能:
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 3
,loop_3
的类型变为 '_a -> '_a list = <fun>
.与我有关的主要区别在于它将函数从多态函数(其输入为'a
)更改为弱多态函数(输入类型为'_a
)。为什么会这样?有什么办法可以解决这个问题吗?
要解决此问题,您需要进行 eta 扩展,即提供所有参数。
您看到OCaml 的值限制的结果。在 SO 和 OCaml 的常见问题解答中有很多关于该主题的好答案。我最喜欢的答案之一是 this.