Dar*_*ana 3 ocaml types casting
以下Ocaml型铸造/转换方法有何区别?
let a = (float) b ;;
Run Code Online (Sandbox Code Playgroud)
和
let a = float_of_int b ;;
Run Code Online (Sandbox Code Playgroud)
(考虑a是浮点数,b是整数.)是否有任何优势?或者它们是一样的吗?
Jef*_*eld 11
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.
Run Code Online (Sandbox Code Playgroud)
但是没有名为(比如说)的功能int:
# int 3.1;;
Error: Unbound value int
# (int) 3.0;;
Error: Unbound value int
Run Code Online (Sandbox Code Playgroud)
C(和相关语言)中的类型转换与OCaml的强类型系统实际上不兼容.
根据他们的定义中pervasives模块,float和float_of_int两个相同的功能:
external float : int -> float = "%floatofint"
external float_of_int : int -> float = "%floatofint"
Run Code Online (Sandbox Code Playgroud)
此外,写作风格 (float) b不是类型转换.它仍然是一个功能应用程序.这里使用的括号并不意味着类型转换,但它们可以被视为表达式的一部分.
例如,以下三个表达式是相同的:
let a = (float) b;;
let a = (float b);;
let a = float b;;
Run Code Online (Sandbox Code Playgroud)