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

Tim*_*ith 10 f#

F#中的列表,数组和元组有什么区别?在需要时,它们之间的转换是否容易?它们在精神上看起来都很相似,所以我真正需要知道的是什么才能让我明白何时使用它?

Ree*_*sey 13

一个元组是无名的,有序的值的分组.元组中的每个值不需要是相同的类型,这意味着您可以将元组定义为:

let someTuple = (1, "foo", 42.3)
Run Code Online (Sandbox Code Playgroud)

这将创建一个包含int,string和float值的元组.

一个列表是值的有序集合相同类型的这是不可改变的.这可能是函数式编程中最常用的集合类型,因为它完全不可变,并且具有许多用于创建基于先前创建的列表构建的列表的功能,这使得您可以创建"增长"的集合(它们实际上是新的然而,集合,因为列表是不可变的).

一个阵列是一固定的大小,可变集合.它们非常有效,但必须始终是单一类型.

在需要时,它们之间的转换是否容易?

在列表和数组之间进行转换非常容易.您可以使用List.ofArray,List.toArray,Array.ofList,和Array.toList在类型之间的转换.

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

它们在精神上看起来都很相似,所以我真正需要知道的是什么才能让我明白何时使用它?

列表和数组都用于集合.一般来说,如果你要制作"增长"的列表,你会希望更喜欢列表,因为制作一个由元素组成的新列表+原始列表比使用数组做同样的事情要好得多.

数组通常用于更高性能的场景(它们具有更好的内存局部性,更节省空间等),但是它们是可变的和固定的大小,所以当你尝试构建集合时它们通常不是理想的.

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

let (success, value) = int.TryParse(someString)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,自动创建元组,然后模式匹配以在单行代码中提取值.它不是将元组视为"集合",而是将多个值(通常是不同类型)保持在一起的方式.