2

我正在尝试向 Seq 模块添加一些额外的聚合函数。我正在查看此处列出的一些功能的实现:

https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/seq.fs

其中一个免责声明是“此函数返回一个序列,该序列在迭代该序列后立即消化整个初始序列。因此,该函数不应与大型或无限序列一起使用。” 许多函数都是如此,例如 GroupBy。

  • 第一个问题:是否有编写可以有效处理大序列的聚合函数的方法?我知道“大”是主观的;我只是在寻找编写此类函数的通用模式。

  • 第二个问题:如何确保像 Dictionary(在聚合函数中定义的)这样的集合被有效地垃圾收集?我知道字典超出范围时应该被收集,但是有没有办法明确指出这一点?鉴于字典的作用域保留在函数内,我不能调用 .Clear() 对吗?

4

1 回答 1

6

要回答您的第一个问题 - 在这种情况下,输入的问题是整个序列必须在函数之前处理foldgroupBy可以给出结果。您可以做几件事:

  • 使用类似Seq.scan聚合值的函数,fold但在添加每个元素后产生当前状态 - 结果也是序列,您可以懒惰地使用它(例如,获得越来越精确的结果)。

  • 在编写返回的函数时seq<'a>,您应该对它们进行设计,以便从序列中获取下一个元素仅消耗输入的一些可预测数量的元素(而不是整个输入序列)。这是不可能的,例如对于groupBy,但是您可以编写类似分组的构造,只对同一组的相邻元素进行分组。

要回答第二个问题 - 您通常不应该过多地担心垃圾收集器。在函数结束时强制垃圾回收可能会比仅仅依靠 GC 正常工作造成更大的危害。

于 2011-06-23T11:35:41.653 回答