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模块中的定义,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;;
let a = (float) b
被语法规则解释为
let a = float b
其中 float
是类型 int -> float
的函数,恰好与 float_of_int
是相同的函数。这不是类 C 语句的类型转换
double a = (float)b;
在 OCaml 中没有等效项。
下面的 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模块中的定义,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;;
let a = (float) b
被语法规则解释为
let a = float b
其中 float
是类型 int -> float
的函数,恰好与 float_of_int
是相同的函数。这不是类 C 语句的类型转换
double a = (float)b;
在 OCaml 中没有等效项。