F #: Как мне разбить последовательность на последовательность последовательностей

Фон:

У меня есть последовательность непрерывных данных с отметкой времени. В последовательности данных есть пробелы, в которых данные не являются смежными. Я хочу создать метод для разделения последовательности на последовательность последовательностей так, чтобы каждая подпоследовательность содержала непрерывные данные (разбивать входную последовательность в промежутках).

Ограничения:

Возвращаемое значение должно быть последовательностью последовательностей, чтобы гарантировать, чтоэлементы производятся только по мере необходимости (нельзя использовать список / массив / кеширование)Решение НЕ должно быть O (n ^ 2), вероятно, исключая паттерн Seq.take - Seq.skip (ср.Брайан сообщение)Бонусные баллы за функционально идиоматический подход (так как я хочу стать более опытным в функциональном программировании), но это 'Это не требование.

Подпись метода

let groupContiguousDataPoints (timeBetweenContiguousDataPoints : TimeSpan) (dataPointsWithHoles : seq) : (seq)= ... 

На первый взгляд, проблема выглядела тривиально для меня, но даже с использованием Seq.pairwise, IEnumerator <_>Последовательность понимания и выход заявления, решение ускользает от меня. Я уверен, что это потому, что мне все еще не хватает опыта объединения F # -идиом или, возможно, потому что есть некоторые языковые конструкции, с которыми я еще не сталкивался.

// Test data
let numbers = {1.0..1000.0}
let baseTime = DateTime.Now
let contiguousTimeStamps = seq { for n in numbers ->baseTime.AddMinutes(n)}

let dataWithOccationalHoles = Seq.zip contiguousTimeStamps numbers |> Seq.filter (fun (dateTime, num) -> num % 77.0  0.0) // Has a gap in the data every 77 items

let timeBetweenContiguousValues = (new TimeSpan(0,1,0))

dataWithOccationalHoles |> groupContiguousDataPoints timeBetweenContiguousValues |> Seq.iteri (fun i sequence -> printfn "Group %d has %d data-points: Head: %f" i (Seq.length sequence) (snd(Seq.hd sequence)))

Ответы на вопрос(8)

Ваш ответ на вопрос