以下Ocaml類型鑄造/轉換方法之間的區別是什麼?OCaml類型鑄造之間的區別
let a = (float) b ;;
而且
let a = float_of_int b ;;
(考慮一個是float和b是整數)。 它有什麼優勢一個比另一個?還是他們一樣?
以下Ocaml類型鑄造/轉換方法之間的區別是什麼?OCaml類型鑄造之間的區別
let a = (float) b ;;
而且
let a = float_of_int b ;;
(考慮一個是float和b是整數)。 它有什麼優勢一個比另一個?還是他們一樣?
OCaml中沒有通用的類型轉換機制。碰巧有一個名爲float
的函數,其功能與float_of_int
一樣。你可以使用任何一個,有或沒有額外的括號。
$ ocaml
OCaml version 4.03.0
# float 3;;
- : float = 3.
# float_of_int 3;;
- : float = 3.
# (float) 3;;
- : float = 3.
# (float_of_int) 3;;
- : float = 3.
但目前還沒有命名的功能(比如說)int
:
# int 3.1;;
Error: Unbound value int
# (int) 3.0;;
Error: Unbound value int
類型轉換爲C(和相關語言)不會真的是用OCaml中的強類型的系統兼容。
根據他們的pervasives模塊中的定義,float
和float_of_int
兩個相同的功能:
external float : int -> float = "%floatofint"
external float_of_int : int -> float = "%floatofint"
此外,寫(float) b
的風格是不是類型轉換。它仍然是一個功能應用程序。這裏使用的括號並不意味着類型轉換,但可以將它們視爲表達式的一部分。
例如,下面三個表達式是相同的:
let a = (float) b;;
let a = (float b);;
let a = float b;;
let a = (float) b
由語法規則解釋爲
let a = float b
其中float
是int -> float
類型的函數,並且發生與float_of_int
的功能相同。這不是類似於類似C語句的類型轉換
double a = (float)b;
它在OCaml中沒有等價物。
有趣的是,(float)不會導致(float)對0個參數的應用(錯誤,因爲它需要一個int參數)。我應該重新學習語法.. –
OCaml函數是第一類的值,並且您可以始終使用它們的參數比它們所用的參數更少,包括0.允許使用括號表示任何表達式,並且函數名稱(作爲第一個類的值)是表達。 –
@HunanRostomyan OCaml中的函數調用語法就是'expression expression',其中第一個表達式需要計算一個函數。請注意,沒有括號是該語法的一部分。圓括號僅用於表達式的分組,並可以添加在任何表達式中(如果您願意,可以編寫'(1)+(2)')。 – sepp2k