2009-09-26 11 views
9

Stavo cercando di utilizzare Seq.first oggi, e il compilatore dice che è stato deprecato in favore di Seq.tryPick. Dice che applica una funzione e restituisce il primo risultato che restituisce Some. Immagino di poter dire fun fun x -> x! = 0 dato che so che il primo restituirà alcuni nel mio caso, ma qual è il vincolo corretto da mettere qui? Qual è la sintassi corretta?Come si usa tryPick per ottenere il primo elemento di una sequenza?

Per chiarire, io voglio usare nel formato:

let foo (x: ss) = x.filter (fun x -> x> 0) |> Seq.tryPick (??)

risposta

17

la chiave è che 'Seq.first' non ha restituito il primo elemento, piuttosto restituito il primo elemento che ha trovato un certo predicato 'scegliere':

let a = [1;2;3] 
// two ways to select the first even number (old name, new name) 
let r1 = a |> Seq.first (fun x -> if x%2=0 then Some(x) else None) 
let r2 = a |> Seq.tryPick (fun x -> if x%2=0 then Some(x) else None) 

Se si desidera solo il primo elemento, utilizzare Seq.head

let r3 = a |> Seq.head 
+0

Grazie, ho appena provato 'seq.first' e ho ricevuto il messaggio deprecato, ma non l'ho mai usato prima, quindi non conoscevo la sintassi esatta. Seq.hd funziona perfettamente. – esac

+6

FYI, sembra che sia stato cambiato in 'Seq.head' in F # 2.0. – elo80ka

Problemi correlati