2016-08-14 9 views
1

以下のOcaml型キャスティング/変換メソッドの違いは何ですか?OCaml型キャスティングの違い

let a = (float) b ;; 

そして

let a = float_of_int b ;; 

(フロート及びbは整数であることを検討してください。) 別超える任意の利点1はありますか?それとも同じですか?

答えて

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の強力な型システムと互換性がありません。

external float : int -> float = "%floatofint" 
external float_of_int : int -> float = "%floatofint" 

さらに、(float) bを書くのスタイルは鋳造を入力されていません。

+0

興味深いことに、 '(float)'は、 'float'を0引数に(誤って)適用することはありません。私は構文を再訪すべきです.. –

+3

OCaml関数はファーストクラスの値であり、0を含むより少ない引数で常に使うことができます。任意の式を括弧でくくることができ、関数名(ファーストクラスの値)は表現。 –

+1

@HunanRostomyan OCamlの関数呼び出し構文は、最初の式を関数に評価する必要がある、単に式式です。括弧はその構文の一部ではないことに注意してください。括弧は単純に式をグループ化するために使用され、任意の式の周りに追加することができます(望むなら '(1)+(2) 'と書くことができます)。 – sepp2k

6

pervasivesモジュールにおけるそれらの定義によると、floatfloat_of_intは、2つの同一の機能です。それはまだ関数アプリケーションです。ここで使用されている括弧は型キャストを意味するものではありませんが、式の一部と見なすことができます。

は、例えば、以下の3つの式が同じである:

let a = (float) b;; 

let a = (float b);; 

let a = float b;; 
4
let a = (float) b 

floatタイプ int -> floatの関数であり、たまたま
let a = float b 

ような構文規則によって解釈されfloat_of_intと同じ機能です。これはCのようなステートメントのような型変換ではありません

double a = (float)b; 

これはOCamlには等価なものがありません。