在 F# 中,这些看起来像集合的东西是什么?
In F# what are these collection-looking things?
在 F# 中,有许多不同的类似集合的语法可以编译成某种东西。它们都是什么,它们是什么意思?
let s1 = [a, b, c, d]
let s2 = [a; b; c; d]
let s3 = (a, b, c, d)
let s4 = (a, b, c, d)
let s5 = [|a, b, c, d|]
let s6 = [|a; b; c; d|]
let s7 = a, b, c, d
let s8 = { aa = 3; bb = 4 }
[a, b, c, d]
是一个以单个 4 元组作为元素的列表。
[a; b; c; d]
是一个四元素列表。
(a, b, c, d)
是一个 4 元组。
[|a, b, c, d|]
是一个以单个 4 元组为元素的数组。
[|a; b; c; d|]
是一个四元素数组。
a, b, c, d
是一个 4 元组。
{ aa = 3; bb = 4 }
是一个记录类型的值,有两个字段aa
和bb
.
let s1 = [a, b, c, d]
等价于[(a, b, c, d)]
:包含一个四元组的列表(tuple of 4 elements)。
let s2 = [a; b; c; d]
具有 4 个元素的 list。
let s3 = (a, b, c, d)
一个四人间。
let s4 = (a, b, c, d)
同一个四合院。
let s5 = [|a, b, c, d|]
等价于 [|(a, b, c, d)|]
:包含一个四元组的 array。
let s6 = [|a; b; c; d|]
一个包含 4 个元素的数组。
let s7 = a, b, c, d
四元组(在这种情况下可以省略括号并且没有歧义)。
let s8 = { aa = 3; bb = 4 }
record定义。
райтфолд的回答给了你答案,下次你有这样的问题我会尽量给你一个自己得到答案的方法。
最简单的方法是使用 F# interactive(您可以从 Visual Studio 从视图 -> 其他 Windows -> F# Interactive 开始)。只需键入 F# 代码,添加双分号 ;;
,然后按 ENTER。要使您的声明有效,您必须先声明 a
、b
、c
和 d
。让我们把它们都设为整数:
> let a = 1
let b = 2
let c = 3
let d = 4
;;
val a : int = 1
val b : int = 2
val c : int = 3
val d : int = 4
现在你可以试试你的声明了:
> let s1 = [a, b, c, d];;
val s1 : (int * int * int * int) list = [(1, 2, 3, 4)]
F# Interactive 打印回计算的表达式类型。在这种情况下,它是 (int * int * int * int) list
。怎么读呢? *
用于划分 tuple type, so (int * int * int * int)
means a tuple with four elements, all types as int
. Following list
means a list 个元素。所以 (int * int * int * int) list
是一个元组列表,每个元组有四个 int
类型的元素。
> let s2 = [a; b; c; d];;
val s2 : int list = [1; 2; 3; 4]
类似的概念,这次是list
个int
个元素。
> let s3 = (a, b, c, d);;
val s3 : int * int * int * int = (1, 2, 3, 4)
这个已经在上面解释过:int * int * int * int
是一个四元素元组,所有元素的类型都为 int
。
> let s5 = [|a, b, c, d|]
let s6 = [|a; b; c; d|];;
val s5 : (int * int * int * int) [] = [|(1, 2, 3, 4)|]
val s6 : int [] = [|1; 2; 3; 4|]
这些与 s1
和 s2
非常相似,但不是 list
元素类型后面跟着 []
- 这意味着它是 an array。 s5
是 (int * int * int * int)
个元素的数组,s6
是 int
个元素的数组。
> let s7 = a, b, c, d;;
val s7 : int * int * int * int = (1, 2, 3, 4)
与s3
相同。
> let s8 = { aa = 3; bb = 4 };;
let s8 = { aa = 3; bb = 4 };;
-----------^^
stdin(18,12): error FS0039: The record label 'aa' is not defined
这个很棘手。要使其工作,您必须先声明 record type:
> type myRecordType = { aa: int; bb: int };;
type myRecordType =
{aa: int;
bb: int;}
它可以工作并打印出 s8
是 myRecordType
:
的一个实例
> let s8 = { aa = 3; bb = 4 };;
val s8 : myRecordType = {aa = 3;
bb = 4;}
在 F# 中,有许多不同的类似集合的语法可以编译成某种东西。它们都是什么,它们是什么意思?
let s1 = [a, b, c, d]
let s2 = [a; b; c; d]
let s3 = (a, b, c, d)
let s4 = (a, b, c, d)
let s5 = [|a, b, c, d|]
let s6 = [|a; b; c; d|]
let s7 = a, b, c, d
let s8 = { aa = 3; bb = 4 }
[a, b, c, d]
是一个以单个 4 元组作为元素的列表。
[a; b; c; d]
是一个四元素列表。
(a, b, c, d)
是一个 4 元组。
[|a, b, c, d|]
是一个以单个 4 元组为元素的数组。
[|a; b; c; d|]
是一个四元素数组。
a, b, c, d
是一个 4 元组。
{ aa = 3; bb = 4 }
是一个记录类型的值,有两个字段aa
和bb
.
let s1 = [a, b, c, d]
等价于[(a, b, c, d)]
:包含一个四元组的列表(tuple of 4 elements)。
let s2 = [a; b; c; d]
具有 4 个元素的 list。
let s3 = (a, b, c, d)
一个四人间。
let s4 = (a, b, c, d)
同一个四合院。
let s5 = [|a, b, c, d|]
等价于 [|(a, b, c, d)|]
:包含一个四元组的 array。
let s6 = [|a; b; c; d|]
一个包含 4 个元素的数组。
let s7 = a, b, c, d
四元组(在这种情况下可以省略括号并且没有歧义)。
let s8 = { aa = 3; bb = 4 }
record定义。
райтфолд的回答给了你答案,下次你有这样的问题我会尽量给你一个自己得到答案的方法。
最简单的方法是使用 F# interactive(您可以从 Visual Studio 从视图 -> 其他 Windows -> F# Interactive 开始)。只需键入 F# 代码,添加双分号 ;;
,然后按 ENTER。要使您的声明有效,您必须先声明 a
、b
、c
和 d
。让我们把它们都设为整数:
> let a = 1
let b = 2
let c = 3
let d = 4
;;
val a : int = 1
val b : int = 2
val c : int = 3
val d : int = 4
现在你可以试试你的声明了:
> let s1 = [a, b, c, d];;
val s1 : (int * int * int * int) list = [(1, 2, 3, 4)]
F# Interactive 打印回计算的表达式类型。在这种情况下,它是 (int * int * int * int) list
。怎么读呢? *
用于划分 tuple type, so (int * int * int * int)
means a tuple with four elements, all types as int
. Following list
means a list 个元素。所以 (int * int * int * int) list
是一个元组列表,每个元组有四个 int
类型的元素。
> let s2 = [a; b; c; d];;
val s2 : int list = [1; 2; 3; 4]
类似的概念,这次是list
个int
个元素。
> let s3 = (a, b, c, d);;
val s3 : int * int * int * int = (1, 2, 3, 4)
这个已经在上面解释过:int * int * int * int
是一个四元素元组,所有元素的类型都为 int
。
> let s5 = [|a, b, c, d|]
let s6 = [|a; b; c; d|];;
val s5 : (int * int * int * int) [] = [|(1, 2, 3, 4)|]
val s6 : int [] = [|1; 2; 3; 4|]
这些与 s1
和 s2
非常相似,但不是 list
元素类型后面跟着 []
- 这意味着它是 an array。 s5
是 (int * int * int * int)
个元素的数组,s6
是 int
个元素的数组。
> let s7 = a, b, c, d;;
val s7 : int * int * int * int = (1, 2, 3, 4)
与s3
相同。
> let s8 = { aa = 3; bb = 4 };;
let s8 = { aa = 3; bb = 4 };;
-----------^^
stdin(18,12): error FS0039: The record label 'aa' is not defined
这个很棘手。要使其工作,您必须先声明 record type:
> type myRecordType = { aa: int; bb: int };;
type myRecordType =
{aa: int;
bb: int;}
它可以工作并打印出 s8
是 myRecordType
:
> let s8 = { aa = 3; bb = 4 };;
val s8 : myRecordType = {aa = 3;
bb = 4;}