許多語言允許顯式給出泛型函式的型別引數。
例如,如果我們在 Java 或 TypeScript 中有一個具有以下簽名的函式:
void f<T>();
......和一個型別MyType
,我們可以用明確給出的型別引數撰寫f<MyType>()
呼叫。f
T
MyType
OCaml 有這個功能嗎?
如果答案是否定的——這是因為 OCaml 的型別推斷非常強大,以至于永遠不會出現型別應用程式有用的情況嗎?
uj5u.com熱心網友回復:
OCaml 型別推斷是五個例外(GADT、高階多型性、高階標記函式、遞回多型性和型別導向消歧)之外的主要因素。這意味著型別檢查器推斷出的型別始終是最通用的可能型別,并且在某些 OCaml 程式中添加型別注釋只能將型別良好的程式轉換為型別錯誤的程式,反方向是不可能的。(再次超出前面提到的高級子集)。
特別是函式應用程式的型別是主要的,f x
并且總是可以推斷出的型別。
因此,在撰寫應用程式時,為函式提供顯式型別引數 à la System F 既沒有必要也沒有用。
uj5u.com熱心網友回復:
OCaml 沒有臨時多型性。也就是說,你不能讓一個函式根據它給出的或預期回傳的引數的型別而有不同的行為。因此,您從 Java/TypeScript 中給出的示例在 OCaml 中是不合理的。
此外,OCaml 允許對任何運算式進行型別注釋。因此,不需要專門針對函式應用的獨特語法。例如,要注釋函式應用程式的回傳型別,您可以執行(f (): my_type)
或let x: my_type = f () in ...
。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/460195.html
上一篇:為什么interfaceextendsRecord<string,...>允許數字鍵?
下一篇:Java:泛型型別引數之間的區別