2009-09-26 11 views
9

Próbowałem użyć Seq.first dzisiaj, a kompilator mówi, że został przestarzały na rzecz Seq.tryPick. Mówi, że stosuje funkcję i zwraca pierwszy wynik, który zwraca Some. Sądzę, że mogę po prostu powiedzieć fun x -> x! = 0, ponieważ wiem, że pierwszy zwróci trochę w moim przypadku, ale jakie jest właściwe ograniczenie, które należy tu umieścić? Jaka jest prawidłowa składnia?Jak korzystać z tryPick, aby uzyskać pierwszy element sekwencji?

celu wyjaśnienia, chcę użyć go w formacie:

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

Odpowiedz

17

kluczem jest to, że „Seq.first” nie wrócił pierwszy element, a powrócił pierwszy element, który pasował jakiś „wybierz” predykat:

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) 

Jeśli chcesz tylko pierwszy element, użyj Seq.head

let r3 = a |> Seq.head 
+0

Dzięki, po prostu próbowałem "seq.first" i otrzymałem przestarzałą wiadomość, ale nigdy wcześniej jej nie używałem, więc nie znałem dokładnej składni. Seq.hd działa idealnie. – esac

+6

FYI, wydaje się, że zostało zmienione na 'Seq.head' w F # 2.0. – elo80ka

Powiązane problemy