F# 中的列表、数组和元组之间有什么区别?

What is difference between lists, arrays, and tuples in F#?

F# 中的列表、数组和元组有什么区别?需要时在它们之间转换是否容易?它们在本质上看起来都很相似,那么实际上我需要知道什么才能让我了解何时使用它们?

A tuple 是一组未命名的有序值。元组中的每个值不需要是同一类型,这意味着您可以像这样定义一个元组:

let someTuple = (1, "foo", 42.3)

这将创建一个包含整数、字符串和浮点值的元组。

list 是相同类型 值的有序集合,它是不可变的。这可能是函数式编程中最常用的集合类型,因为它是完全不可变的,并且具有许多用于在先前创建的列表之上创建列表的功能,这使您可以创建 "grow"(它们是但是,实际上是新集合,因为列表是不可变的)。

array 是一个固定大小的可变集合。它们的创建效率非常高,但必须始终是单一类型。

Is it easy to convert between them when required?

列表和数组之间的转换非常容易。您可以使用 List.ofArrayList.toArrayArray.ofListArray.toList 在类型之间进行转换。

从元组转换为数组或列表并不常见,而且并非总是可行,因为元组允许在其中存储多种类型。

They seem all similar in spirit, so what do actually I need to know that lets me understand when to use one versus another?

列表和数组都用于集合。一般来说,如果你要制作 "grow" 的列表,你会更喜欢列表,因为制作一个由一个元素 + 原始列表组成的新列表比用一个元素做同样的事情要有效得多大批。

数组通常用于更高性能的场景(它们具有更好的内存局部性,更 space 高效等),但是可变且大小固定,因此当您尝试构建集合。

元组通常用于完全不同的场景。元组最常见的用例是将多个项目作为一个值传递。例如,当使用具有 out 参数的框架方法时会自动发生这种情况,因此您会看到如下用例:

let (success, value) = int.TryParse(someString)

在这种情况下,元组会自动创建,然后进行模式匹配以在单行代码中提取值。与其将元组视为 "collection",它更像是一种将多个值(通常是不同类型)保存在一起的方法。

关于使用 collection 类型:

Lists when: 你需要一个动态的 collection 改变大小。列表是一个单向链表,因此请记住,列表的每个成员都需要 4 或 8 个字节的额外内存来存储指向下一个列表元素的指针。

Arrays when: 您需要存储大量的原始值,如整数、浮点数或字节。数组表示为值保留的静态内存块,当您必须存储例如图像的字节时,这是有效的。

额外有用的 collections:

套当: 需要储存,好一套。集合是 collection 个唯一值。 Set 具有计算差、并和交的有用函数。例如,您可能有一组所有人 (A) 和一组买了糖果的人 (B),所以您现在可以计算 A - B = C,现在您有一组 C 代表没有买糖果的人。

Maps when: 您需要从一个值到另一个值的投影。现在在前面的例子中你计算了集合 C(没有买糖果的人),你可能使用了一些 id 来描述这些人。现在您可以使用 Map 将此 ID 投影到人员记录 :).

我希望这有用。