OCaml类型转换之间的区别

Difference between OCaml Type casting

下面的 Ocaml 类型转换/转换方法有什么区别?

let a = (float) b ;;

let a = float_of_int b ;;

(假设 a 是一个浮点数,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模块中的定义,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;;
let a = (float) b 

被语法规则解释为

let a = float b 

其中 float 是类型 int -> float 的函数,恰好与 float_of_int 是相同的函数。这不是类 C 语句的类型转换

double a = (float)b;

在 OCaml 中没有等效项。