2016-08-14 6 views
1

Was sind die Unterschiede zwischen Ocaml Typ Casting/Konvertierung Methoden unten?Unterschied zwischen OCaml Typ Casting

let a = (float) b ;; 

Und

let a = float_of_int b ;; 

(Betrachten Sie ein ein Schwimmer und b ist eine ganze Zahl.) Gibt es einen Vorteil übereinander? oder sind sie gleich?

Antwort

9

In OCaml gibt es keinen allgemeinen Typ-Casting-Mechanismus. Es gibt eine Funktion namens float, die dasselbe tut wie float_of_int. Sie können entweder einen mit oder ohne die zusätzlichen Klammern verwenden.

$ 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. 

Aber es gibt keine Funktion mit dem Namen (sagen wir) int:

# int 3.1;; 
Error: Unbound value int 
# (int) 3.0;; 
Error: Unbound value int 

Typ Guss wie in C (und verwandte Sprachen) nicht wirklich mit dem starken Typsystem von OCaml kompatibel sein.

+0

Interessant, wie '(float)' nicht zur (fehlerhaften) Anwendung von 'float' auf 0 Argumente führt (fehlerhaft, da ein' int' Argument erwartet wird). Ich sollte die Syntax noch einmal überprüfen. –

+3

OCaml-Funktionen sind Werte der ersten Klasse, und Sie können sie immer mit weniger Argumenten verwenden als sie annehmen, einschließlich 0. Das Einschließen eines beliebigen Ausdrucks ist zulässig, und ein Funktionsname (ein Wert der ersten Klasse) ist ein Ausdruck. –

+1

@HunanRostomyan Die Funktionsaufrufsyntax in OCaml ist einfach Ausdruckausdruck, wobei der erste Ausdruck zu einer Funktion ausgewertet werden muss. Beachten Sie, dass keine Klammern in dieser Syntax enthalten sind. Klammern werden einfach zum Gruppieren von Ausdrücken verwendet und können um jeden Ausdruck herum hinzugefügt werden (so wie Sie '(1) + (2)' schreiben könnten, wenn Sie das möchten. – sepp2k

6

Nach ihren Definitionen im pervasives Modul, float und float_of_int sind zwei identische Funktionen:

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

Außerdem ist die Art des Schreibens ist (float) b nicht Gußausführung. Es ist immer noch eine Funktion Anwendung. Die hier verwendeten Klammern bedeuten nicht Typ-Casting, sie können jedoch als Teile des Ausdrucks angesehen werden.

Zum Beispiel sind die folgenden drei Ausdrücke die gleiche:

let a = (float) b;; 

let a = (float b);; 

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

wird durch die Syntaxregeln interpretiert als

let a = float b 

wo float eine Funktion vom Typ ist int -> float und geschieht die gleiche Funktion wie float_of_int sein. Dies ist keine Typumwandlung wie die C-ähnliche Aussage, die in OCaml kein Äquivalent ist.