2014-12-02 21 views
5

Ho una sequenza di dati che ho bisogno di filtrare. Questo è abbastanza ovvio dato che abbiamo il valore Seq.filter. Ma il mio problema è che ho bisogno di filtrare fino a quando la raccolta risultante raggiungerà un certo numero di elementi. Non voglio eseguire il filtraggio su tutti gli elementi e di fare il troncato, voglio interrompere il filtraggio in un momento in cui non ne ho più bisogno.F # Filtro di sequenza Mentre in uno stile funzionale

Fondamentalmente è un compito molto facile nella programmazione imperativa - Posso farlo facilmente in F # come se fosse fatto in C#, ma mi piacerebbe farlo in stile funzionale.

Ho dato un'occhiata al modulo Collections.Seq ma non ho trovato nulla che possa aiutarmi. In effetti avrò bisogno di qualcosa come filterWhile. Qualche idea?

Grazie per l'aiuto.

risposta

9

Basta usare Seq.filter seguita da una Seq.take con il numero di risultati a cui sei interessato per ottenere:

Seq.filter e Seq.take sono pigri, poi, quando la ss è costretto si fermerà filtrare una volta il risultato raggiunge le dimensioni desiderate .

Ecco un esempio, utilizzando una sequenza infinita di verificare se si ferma davvero filtraggio:

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

E questo è uno stile funzionale, questo è il modo di risolvere il problema in lingue FP usando una collezione pigro , ad esempio in Haskell, che è un puro linguaggio FP, lo fai allo stesso modo con le liste: take 10 (filter (\x -> mod x 2 == 0) [0..]).