2014-12-02 14 views
5

我有一系列我需要過濾的數據。這很明顯,因爲我們有Seq.filter值。但是,我的問題是,我需要過濾,直到產生的集合將達到一定數量的項目。我不想對所有項目執行過濾,也不想對截斷進行過濾,我希望在不再需要時立即停止過濾。F#序列過濾器雖然功能風格

基本上它是命令式編程中的一項非常簡單的任務 - 我可以在F#中輕鬆完成,就像在C#中完成的一樣,但我希望在功能方式上做到這一點。

我看了一下Collections.Seq模塊,但是我還沒有找到任何能幫助我的東西。實際上我需要類似filterWhile。有任何想法嗎?

謝謝你的幫助。

回答

9

你只需要使用Seq.filter接着是Seq.take有結果,你有興趣獲得的數量:

Seq.filterSeq.take懶惰,那麼當SEQ被迫將停止過濾,一旦結果達到所需的大小。

下面是一個例子,使用無限序列,以測試它是否真的停止過濾:

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

這是一個實用的風格,這是一個使用延遲集合您解決在FP語言問題的辦法例如,在純粹的FP語言Haskell中,您可以使用與列表相同的方式:take 10 (filter (\x -> mod x 2 == 0) [0..])