2015-02-06 37 views
0

我有一个函数:柯里函数取消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)。这是为什么发生?有什么办法可以解决这个问题吗?

回答

1

要解决,你需要ETA-扩大,即提供所有参数。

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