2016-08-14 105 views
1

以下Ocaml類型鑄造/轉換方法之間的區別是什麼?OCaml類型鑄造之間的區別

let a = (float) b ;; 

而且

let a = float_of_int b ;; 

(考慮一個是float和b是整數)。 它有什麼優勢一個比另一個?還是他們一樣?

回答

9

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中的強類型的系統兼容。

+0

有趣的是,(float)不會導致(float)對0個參數的應用(錯誤,因爲它需要一個int參數)。我應該重新學習語法.. –

+3

OCaml函數是第一類的值,並且您可以始終使用它們的參數比它們所用的參數更少,包括0.允許使用括號表示任何表達式,並且函數名稱(作爲第一個類的值)是表達。 –

+1

@HunanRostomyan OCaml中的函數調用語法就是'expression expression',其中第一個表達式需要計算一個函數。請注意,沒有括號是該語法的一部分。圓括號僅用於表達式的分組,並可以添加在任何表達式中(如果您願意,可以編寫'(1)+(2)')。 – sepp2k

6

根據他們的pervasives模塊中的定義,floatfloat_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;; 
4
let a = (float) b 

由語法規則解釋爲

let a = float b 

其中floatint -> float類型的函數,並且發生與float_of_int的功能相同。這不是類似於類似C語句的類型轉換

double a = (float)b; 

它在OCaml中沒有等價物。