2014-12-02 3 views
5

У меня есть последовательность данных, которые мне нужно фильтровать. Это совершенно очевидно, так как мы имеем значение Seq.filter. Но, моя проблема в том, что мне нужно отфильтровать, пока итоговая коллекция не достигнет определенного количества элементов. Я не хочу выполнять фильтрацию по всем элементам, а не делать truncate, я хочу остановить фильтрацию в момент, когда мне это больше не нужно.F # Фильтр последовательности В функциональном стиле

В принципе, это очень простая задача в императивном программировании - я могу сделать это легко в F #, как это было бы сделано на C#, но я хотел бы сделать это в функциональном стиле.

Я взглянул на модуль Collections.Seq, но я не нашел ничего, что поможет мне. На самом деле мне понадобится что-то вроде filterWhile. Есть идеи?

Благодарим за помощь.

ответ

9

Вы просто использовать Seq.filter с последующим Seq.take с числом результатов вы заинтересованы, чтобы получить:

Seq.filter и Seq.take ленивы, то при последующих вынужден будет прекратить фильтрацию когда результат достигает нужного размера ,

Вот пример, используя бесконечную последовательность, чтобы проверить, если он действительно останавливает фильтрацию:

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

И это функциональный стиль, это то, как вы решить проблему FP языков с помощью ленивой коллекции , например, в Haskell, который является чистым языком FP, вы делаете это так же со списками: take 10 (filter (\x -> mod x 2 == 0) [0..]).

Смежные вопросы