2014-04-23 13 views
9

Dato il seguente:Passando funzione F # per IEnumerable.Where vs IEnumerable.All

open System.Linq 

let even n = n % 2 = 0 

let seqA = seq { 0..2..10 } 

questa è un'espressione valida:

seqA.Where(even) 

ma non è questo:

seqA.All(even) 

Perché il passaggio da even a Where è consentito ma non a All?

+0

Qual è il messaggio di errore hai trovato? –

+1

Secondo me hai scoperto un bug. Vorrei inviare questo a [email protected] – Daniel

+5

Questo sembra essere un altro caso di [questo] (http://stackoverflow.com/questions/12933366/f-func-type-inference-difference-between-seq-and-pseq-todictionary). Come soluzione alternativa, 'seqA.All (System.Func <_,_> (even))' dovrebbe funzionare, o 'seqA.All (fun x -> even x)'. –

risposta

1

Mentre ci può essere un problema lì, penso che l'approccio migliore sarebbe quella di utilizzare le funzioni di ordine superiore Seq quando si tratta di IEnumerable<T> in F #, piuttosto che Linq

let even n = n % 2 = 0 
let seqA = seq { 0..2..10 } 

seqA |> Seq.filter even 
//val it : seq<int> = seq [0; 2; 4; 6; ...] 

seqA |> Seq.forall even 
//val it : bool = true 
Problemi correlati