何时使用F#中的序列而不是列表?

时间:2012-05-30 10:09:34

标签: list f#

我了解list实际上包含值,而sequenceIEnumerable<T>的别名。在实际的F#开发中,我何时应该使用序列而不是列表?

以下是我可以看到序列更好的原因:

  • 与其他需要的.NET语言或库交互时 IEnumerable<T>
  • 需要代表一个无限的序列(在实践中可能并不真正有用)。
  • 需要懒惰评估。

还有其他人吗?

5 个答案:

答案 0 :(得分:82)

我认为您在何时选择Seq的摘要非常好。以下是一些补充要点:

  • 在编写函数时默认使用Seq,因为它们适用于任何.NET集合
  • 如果您需要SeqSeq.windowed
  • 等高级功能,请使用Seq.pairwise

我认为默认情况下选择Seq是最佳选择,那么何时会选择不同的类型?

  • 使用List模式进行递归处理时使用head::tail (实现标准库中不可用的一些功能)

  • 当您需要一个可以逐步构建的简单不可变数据结构时,请使用List (例如,如果您需要在一个线程上处理列表 - 显示一些统计信息 - 并在您收到更多值(即从网络服务)同时继续在另一个线程上构建列表)

  • 使用List处理短列表时 - 如果值通常表示空列表,则列表是最佳使用的数据结构,因为它非常有效方案

  • 当您需要大量值类型时,请使用Array (数组将数据存储在平坦的内存块中,因此在这种情况下它们的内存效率更高)

  • 当您需要随机访问或更高性能(以及缓存位置)时使用Array

答案 1 :(得分:26)

在以下情况下也更喜欢seq

  • 您不希望同时将所有元素保存在内存中。

  • 表现并不重要。

  • 您需要在枚举前后执行某些操作,例如:连接到数据库并关闭连接。

  • 您没有连接(重复Seq.append将堆叠溢出)。

在以下时间选择list

  • 元素很少。

  • 你会在前期和斩首之前。

seqlist都不适合并行,但这并不一定意味着它们也不好。例如,您可以使用其中一个来表示要并行完成的一小组单独的工作项。

答案 2 :(得分:11)

只有一个小点:SeqArray优于List并行。

您有几个选项:来自F#PowerPack的PSeqArray.Parallel模块和Async.Parallel(异步计算)。由于其顺序性(head::tail组合),列表对于并行执行非常糟糕。

答案 3 :(得分:7)

列表功能更强,数学友好。当每个元素相等时,2个列表相等。

序列不是。

let list1 =  [1..3]
let list2 =  [1..3]
printfn "equal lists? %b" (list1=list2)

let seq1 = seq {1..3}
let seq2 = seq {1..3}
printfn "equal seqs? %b" (seq1=seq2)

enter image description here

答案 4 :(得分:4)

您应该始终在公共API中公开Seq。在内部实施中使用ListArray