2015-02-06 36 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