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

Why is an array type written as if it was a list, in F#?

具有以下内容:

let a = "hello world".Split(' ')

return类型是字符串数组,但是类型写成:

System.String[]

我不明白为什么:

另一个例子:

([| 3 |]).GetType()
val it : System.Type =
  System.Int32[]

为什么会这样?

这种不一致可能是由于 F# 是一种 .NET 语言。

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

  • 在.NET中,数组类型写成System.Int32[]。这是您从 GetType 获得的内容,F# 无法覆盖它,因为它来自 .NET 库。

  • 至于类型名称,如果你想明确地写类型,你总是可以使用 'a list'a array

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

我认为这是有原因的,但不是很令人满意:

  • 类型和值的写法不一样。例如元组类型写成'A * 'B,而元组值是写成(a, b)。我们中的一些人可能也更喜欢 ('A, 'B) 作为类型,但 F# 实际上与乘积 types/values 的数学表示方式一致。

  • 对于函数式编程而言,列表比数组更基础,因此编写列表所需的击键次数少于编写数组是有道理的。

  • F# 继承了 OCaml 约定,并将它们改编为 .NET,有时很笨拙。 OCaml中[| 1; 2; 3 |]的类型是int array。 F# 也接受 .NET/C# 名称 int[],这令人困惑,但如果需要,您仍然可以在代码中使用 OCaml 语法:let arr : int array = Array.empty.