F #: Jak podzielić sekwencję na sekwencję sekwencji

Tło:

Mam sekwencję ciągłych danych ze znacznikami czasu. Sekwencja danych zawiera luki, w których dane nie są ciągłe. Chcę utworzyć metodę podziału sekwencji na sekwencję sekwencji, tak aby każdy podsekwencja zawierała ciągłe dane (podziel sekwencję wejściową na przerwy).

Ograniczenia:

Zwracana wartość musi być sekwencją sekwencji, aby to zapewnićelementy są produkowane tylko w razie potrzeby (nie można użyć listy / tablicy / buforowania)Rozwiązaniem NIE może być O (n ^ 2), prawdopodobnie wykluczające wzorzec Seq.take - Seq.skip (por.Briana słupek)Dodatkowe punkty za funkcjonalnie idiomatyczne podejście (ponieważ chcę stać się bardziej biegły w programowaniu funkcjonalnym), ale nie jest to wymagane.

Podpis metody

let groupContiguousDataPoints (timeBetweenContiguousDataPoints : TimeSpan) (dataPointsWithHoles : seq<DateTime * float>) : (seq<seq< DateTime * float >>)= ... 

Na pierwszy rzut oka problem wydawał mi się trywialny, ale nawet wykorzystując Seq.pairwise, IEnumerator <_>, sekwencyjne interpretacje i deklaracje wydajności, rozwiązanie wymyka mi się. Jestem pewien, że dzieje się tak, ponieważ wciąż brakuje mi doświadczenia w łączeniu F # -idioms, a może dlatego, że istnieją pewne konstrukcje językowe, na które jeszcze nie byłem narażony.

// 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)))

questionAnswers(8)

yourAnswerToTheQuestion