2014-12-02 13 views
5

Mam sekwencję danych, które muszę filtrować. Jest to dość oczywiste, ponieważ mamy wartość Seq.filter. Ale moim problemem jest to, że muszę filtrować, dopóki wynikowa kolekcja nie osiągnie określonej liczby elementów. Nie chcę przeprowadzać filtrowania wszystkich elementów, a następnie przycinać, chcę zatrzymać filtrowanie w momencie, gdy już go nie potrzebuję.Filtr sekwencji F # w funkcjonalnym stylu

Zasadniczo jest to bardzo łatwe zadanie w imperatywnym programowaniu - mogę to zrobić z łatwością w F # jak byłoby to zrobione w C#, ale chciałbym to zrobić w stylu funkcjonalnym.

Spojrzałem na moduł Collections.Seq, ale nie znalazłem niczego, co mogłoby mi pomóc. W rzeczywistości potrzebuję czegoś takiego jak filterWhile. Jakieś pomysły?

Dziękuję za pomoc.

Odpowiedz

9

po prostu użyć Seq.filter następnie Seq.take z liczbą wyników jesteś zainteresowany, aby dostać:

Seq.filter i Seq.take są leniwi, a następnie, gdy nast jest zmuszony zatrzyma filtrowanie raz wynik osiągnie żądany rozmiar .

Oto przykład, wykorzystując nieskończoną sekwencję, aby sprawdzić, czy rzeczywiście zatrzymuje filtrowanie:

Seq.initInfinite id 
    |> Seq.filter (fun x -> x % 2 = 0) 
    |> Seq.take 10 
    // then if you force the Seq 
    |> Seq.toArray 

I to jest styl funkcjonalny, w ten sposób można rozwiązać problem w językach FP używając leniwy kolekcji na przykład w Haskell, który jest czystym językiem FP, robisz to w ten sam sposób z listami: take 10 (filter (\x -> mod x 2 == 0) [0..]).

Powiązane problemy