F# 中的类型转换会导致错误的类型和错误的值

问题描述 投票:0回答:1

我想将整数转换为浮点数。

这是我的第一次尝试,两者的值都是错误的,是 2 而不是 9,而且类型也保持不变

int

> a;;
val it: int = 9

> let b = (float)a;;
val b: int = 2

有人可以解释一下吗?

P.S 我设法用

let (b:float) = a
将整数转换为浮点数。

f# type-conversion
1个回答
0
投票

你确定这是真的吗?你确定你没有输入任何错误吗?也许您在上面的某个地方重新定义了

float
函数?

因为,你看,你所认为的“类型转换”并不是。 F# 没有这种 C 风格语法

(type) var
来“强制转换”或“转换”类型。 F# 中有一个“类型转换”的概念(运算符
:>
:?>
),但它仅适用于子类型和超类型,这里不适用。

您在这里实际上所做的是调用

float
函数并将
a
作为参数传递给它。是的,
float
是一个函数的名称。还有类型的名称。类型和函数可以具有相同的名称,就像大多数其他语言一样。

F# 中的函数调用语法为

fn arg
- 只是函数后跟一个空格,然后跟上参数。
fn
位可以是任何产生函数的表达式,它不必是直接的函数名称。例如,只要
(makeFunction 1 2 "foo") arg
函数返回另一个函数,
makeFunction
也可以工作。

这意味着用括号包围

float
函数基本上没有效果。书写
(float)a
相当于
float a

这在我的本地机器上正如预期的那样工作:

- let a = 9
- let b = float a
- let c = (float)a;;
val a: int = 9
val b: float = 9.0
val c: float = 9.0

replit.com 上也发生同样的情况 - 查看一下

我能想到你可能得到结果的唯一方法是在before的某个地方,但在同一个FSI会话中,你已经重新定义了

float
函数,如下所示:

let float x = 2

这确实会产生您所描述的结果:

- let float x = 2
- let a = 9
- let b = float a
- let c = (float)a;;
val float: x: 'a -> int
val a: int = 9
val b: int = 2
val c: int = 2
© www.soinside.com 2019 - 2024. All rights reserved.