在現實世界中OCaml中的this section,它基本上是說:OCaml的標記參數訂購帶有高階函數
let apply_to_tuple f (first, second) = f ~first ~second
let apply_to_tuple_2 f (first, second) = f ~second ~first
let divide ~first ~second = first/second
這使得apply_to_tuple divide (3, 4)
工作,但不apply_to_tuple_2 divide (3, 4)
。後者拋出:
Error: This expression has type first:int -> second:int -> int
but an expression was expected of type second:'a -> first:'b -> 'c
我想知道爲什麼會出現這種情況。看來這裏沒有任何含糊之處,編譯器可以正確推斷所有內容?
對。這是我的問題。在'apply_to_tuple_2'的定義中,我們使用帶標籤的參數調用了_did_,並且似乎沒有任何可能會使編譯器混淆的排序。 – chenglou
'divide'的類型與'apply_to_tuple2'的'f'類型不匹配。這是基本問題。如果你想讓它們匹配,你可以聲明'f'的類型。 (推斷的類型不匹配。)如果您希望它自動工作,您必須更改OCaml類型系統的工作方式。所以我會說編譯器本身不會感到困惑。 –
所以這在理論上是可行的嗎?只需通過匹配正確的標籤來安排訂單? – chenglou