在 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 }是一个记录类型的值,有两个字段aabb.

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。要使您的声明有效,您必须先声明 abcd。让我们把它们都设为整数:

> 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]

类似的概念,这次是listint个元素。

> 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|]

这些与 s1s2 非常相似,但不是 list 元素类型后面跟着 [] - 这意味着它是 an arrays5(int * int * int * int) 个元素的数组,s6int 个元素的数组。

> 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;}

它可以工作并打印出 s8myRecordType:

的一个实例
> let s8 = { aa = 3; bb = 4 };;

val s8 : myRecordType = {aa = 3;
                         bb = 4;}