0

我确信这与这里发生的内部情况有关。希望有人能澄清一下。

我正在访问一个 C# 友好的库。

我有一个充当数组的特定对象(它是来自 lib 的用户定义类型)。在 C# 中我可以调用。

myObject[0] = 1

我这样做没有错误。

如果我尝试在 F# 中执行以下操作,则会出现错误 -The expression was expected to have type float32 but instead has type int.

myObject.[0] <- 1

这行得通。

myObject.[0] <- float32 1

所以问题是,为什么在 C# 中这种类型转换是自动发生的,而在 F# 中却不是?我可以在 F# 中做些什么来清理这样的东西吗?

4

1 回答 1

4

F# 类型检查机制在许多方面都比 C# 中的类型检查更严格。一方面是 F# 不会在幕后进行任何隐式转换,因此您必须使用正确的数字文字(如1.0f)或显式转换函数(如float32)。

为什么语言是这样设计的?一个原因是它使类型推断更简单、更可预测。例如:

let data = [| 0; 1; 2 |]

let writeData n = 
  data.[0] <- n

在这里,F# 编译器知道它data的类型int[](因为它被初始化为包含整数的数组)。它还知道这writeData是一个函数int -> unit,因为数组包含整数,因此n也必须是整数。

如果编译器做了隐式转换,会有很多不确定性:

  • data例如,可能是,float[]或者float32[]因为您可以将整数隐式转换为其他数字类型
  • dwriteData可以采用任何可转换为的数字类型int(例如int16sbyte

这会使类型信息更加复杂,您可能不得不更频繁地明确指定类型。出于这个原因,F# 选择了一个折衷方案——您必须显式地编写转换,但是您不需要经常使用类型注释。

于 2013-03-01T13:50:52.620 回答