Агрегатные функции в модуле Seq - PullRequest
2 голосов
/ 23 июня 2011

Я пытаюсь добавить некоторые дополнительные агрегатные функции в модуль Seq.Я смотрел на реализацию некоторых функций, перечисленных здесь:

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

Один из заявлений об отказе есть «Эта функция возвращает последовательность, которая переваривает всю начальную последовательность, как толькоэта последовательность повторяется. В результате эта функция не должна использоваться с большими или бесконечными последовательностями. "Это верно для многих функций, таких как GroupBy.

  • Первый вопрос: существуют ли методы для написания агрегатных функций, которые могут эффективно обрабатывать большие последовательности?Я знаю, что «Большой» субъективен;Я просто ищу общие шаблоны для написания таких функций.

  • Второй вопрос: как мне обеспечить, чтобы такие коллекции, как Dictionary (которые определены в агрегатных функциях), собирались мусором?эффективно?Я понимаю, что словари следует собирать, когда они выходят за рамки видимости, но есть ли способ указать это явно?Учитывая, что словарь ограничен, чтобы оставаться в функции, я не могу вызвать .Clear () для этого права?

1 Ответ

6 голосов
/ 23 июня 2011

Чтобы ответить на ваш первый вопрос - в этом случае проблема с большими входами состоит в том, что вся последовательность должна быть обработана, прежде чем такие функции, как fold или groupBy, могут дать результат.Есть несколько вещей, которые вы можете сделать:

  • Использовать такие функции, как Seq.scan, которые агрегируют значения точно так же, как fold, но выдают текущее состояние после добавления каждого элемента - результат также является последовательностью иВы можете использовать его laziliy (например, и получить более точный результат).

  • При написании функций, которые возвращают seq<'a>, вы должны спроектировать их так, чтобы получить следующий элемент изпоследовательность потребляет только некоторое предсказуемое количество элементов ввода (но не всю последовательность ввода).Это невозможно, например, для groupBy, но вы можете написать похожую на группировку конструкцию, которая группирует только смежные элементы одной и той же группы.

Чтобы ответить на второй вопрос - вы не должныВообще беспокоиться о сборщике мусора слишком сильно.Принудительная сборка мусора в конце функции, вероятно, принесет больше вреда, чем просто полагаться на работу ГХ.

...