为什么在 F# 中将数组类型编写为列表?
Why is an array type written as if it was a list, in F#?
具有以下内容:
let a = "hello world".Split(' ')
return类型是字符串数组,但是类型写成:
System.String[]
我不明白为什么:
- 你用
[| ... |]
声明了一个数组,但它在类型 中显示为[ ... ]
- 您使用
[ ... ]
声明了一个列表,但它在类型 中显示为 x list
另一个例子:
([| 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
.
具有以下内容:
let a = "hello world".Split(' ')
return类型是字符串数组,但是类型写成:
System.String[]
我不明白为什么:
- 你用
[| ... |]
声明了一个数组,但它在类型 中显示为 - 您使用
[ ... ]
声明了一个列表,但它在类型 中显示为
[ ... ]
x list
另一个例子:
([| 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
.