2016-08-14 2 views
1

В чем разница между методами литья/преобразования типа Ocaml ниже?Разница между литьем OCaml

let a = (float) b ;; 

И

let a = float_of_int 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 - это просто выражение выражения, в котором первое выражение должно оцениваться функцией. Обратите внимание, что никакие круглые скобки не являются частью этого синтаксиса. Скобки просто используются для группировки выражений и могут быть добавлены вокруг любого выражения (например, вы могли бы написать '(1) + (2)', если хотите). – sepp2k

6

В соответствии с их определениями в 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;; 
4
let a = (float) b 

интерпретируется правилами синтаксиса, как

let a = float b 

, где float является функцией типа int -> float и случается будет той же функцией, что и float_of_int. Это не преобразование типа, как С-образное заявление

double a = (float)b; 

, который не имеет эквивалента в OCaml.