89

我知道列表实际上包含值,而序列IEnumerable<T>. 在实际的 F# 开发中,什么时候应该使用序列而不是列表?

以下是我可以看到序列何时会更好的一些原因:

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

还有其他人吗?

4

5 回答 5

105

我认为您对何时选择的总结Seq非常好。以下是一些额外的要点:

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

我认为Seq默认选择是最好的选择,那么我什么时候选择不同的类型呢?

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

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

  • 当您使用List短列表时使用列表是最好的数据结构,如果该值通常表示一个空列表,因为它在这种情况下非常有效。

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

  • Array当您需要随机访问或更高性能(和缓存局部性)时使用

于 2012-05-30T10:31:08.783 回答
30

也更喜欢seq以下情况:

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

  • 性能并不重要。

  • 您需要在枚举之前和之后做一些事情,例如连接到数据库并关闭连接。

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

喜欢list什么时候:

  • 元素很少。

  • 你会提前和斩首很多。

对并行性既不好seq也不list好,但这并不一定意味着它们也不好。例如,您可以使用其中之一来表示一小群要并行完成的单独工作项。

于 2012-05-30T15:22:22.450 回答
13

只是一点点:Seq并且ArrayList并行性更好。

您有多种选择:来自 F# PowerPack 的 PSeq、Array.Parallel模块Async.Parallel(异步计算)。由于其顺序性(head::tail组合),列表对于并行执行来说很糟糕。

于 2012-05-30T11:13:31.710 回答
8

list 更实用,对数学更友好。当每个元素相等时,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)

在此处输入图像描述

于 2017-10-04T21:40:56.927 回答
6

您应该始终Seq在您的公共 API 中公开。在您的内部实现中使用List和。Array

于 2012-05-31T06:26:59.910 回答