OCaml型铸造之间的区别

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的强类型系统实际上不兼容.

  • OCaml函数是第一类值,您始终可以使用参数少于它们的参数,包括0.允许对任何表达式进行括号,并且函数名称(作为第一类值)是表达式. (3认同)

Tru*_* Ta 7

根据他们的定义中pervasives模块,floatfloat_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)