2014-12-02 14 views
5

Filtreleme yapmam gereken bir veri dizim var. Bu Seq.filter değerine sahip olduğu için oldukça belirgindir. Ancak, benim sorunum, sonuçta elde edilen koleksiyonun belirli sayıda öğeye ulaşana kadar filtrelemem gerektiğidir. Filtrelemeyi tüm öğeler üzerinde yapmak istemiyorum ve kesmeyi yapmaktan vazgeçiyorum, artık ihtiyacım olmadığı anda filtrelemeyi durdurmak istiyorum.F # Sıra Filtresi İşlevsel bir tarzdayken

Temel olarak, zorunlu programlamada çok kolay bir görevdir - F # 'de kolayca C# yapılabildiği gibi yapabilirim, ancak bunu fonksiyonel tarzda yapmak istiyorum.

Collections.Seq modülüne bir göz attım ama bana yardımcı olacak hiçbir şey bulamadım. Aslında filterWhile gibi bir şeye ihtiyacım var. Herhangi bir fikir?

Yardımlarınız için teşekkür ederiz. Az önce almak için ilgilenen sonuç sayısı ile Seq.take ardından Seq.filter kullanmak

cevap

9

: seq o filtrelemeyi durdurur zorlandığında

Seq.filter ve Seq.take, tembel sonra sonuç istenilen boyuta ulaştığında . İşte

gerçekten filtreleme durursa test etmek sonsuz bir dizi kullanarak, bir örnek:

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

Ve bu fonksiyonel tarzıdır, bu tembel koleksiyon kullanarak FP dilde sorunu çözmek yoludur Örneğin, Haskell'de saf bir FP dili olan, bunu listelere aynı şekilde yaparsınız: take 10 (filter (\x -> mod x 2 == 0) [0..]).