为什么在 F# 中将数组类型写成一个列表?

Tho*_*mas 4 f#

具有以下内容:

let a = "hello world".Split(' ')
Run Code Online (Sandbox Code Playgroud)

返回类型是一个字符串数组,但类型写为:

System.String[]

我不明白为什么:

  • 你声明一个数组,[| ... |]但它显示为[ ... ]类型
  • 您声明了一个列表,[ ... ]但它显示为x list类型

另一个例子:

([| 3 |]).GetType()
val it : System.Type =
  System.Int32[]
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

Tom*_*cek 5

这种不一致可能是因为 F# 是一种 .NET 语言。

  • 在 F# 中,您希望列表比数组更频繁,因此[ ... ]对列表使用较短的语法而[| ... |]对数组使用较长的语法是有意义的。

  • 在 .NET 中,数组类型被写为System.Int32[]. 这是您从中得到的,GetTypeF# 无法覆盖它,因为它来自 .NET 库。

  • 对于类型名,你可以随时使用'a list'a array如果你想明确写入类型。

  • 最不一致的特性是您也可以编写数组类型,例如int[]在 F# 中。我同意这令人困惑。我认为 F# 在这里只是采用了 C# 中使用的符号。但是,请注意,这也使您可以轻松定义多维数组,例如int[,]int[,,]。我认为多维数组类型没有其他语法。