2009-09-26 8 views
9

Я пытался использовать Seq.first сегодня, и компилятор говорит, что он устарел в пользу Seq.tryPick. В нем говорится, что он применяет функцию и возвращает первый результат, который возвращает Some. Наверное, я могу просто сказать, весело x -> x! = 0, так как я знаю, что первый вернет некоторые в моем случае, но каково надлежащее ограничение для ввода здесь? Каков правильный синтаксис?Как использовать tryPick для получения первого элемента последовательности?

Чтобы уточнить, я хочу использовать его в формате:

Пусть Foo (х: Seq) = x.filter (прикольных х -> х> 0) |> Seq.tryPick (??)

ответ

17

ключ в том, что «Seq.first» не возвращает первый элемент, а он возвращается первый элемент, который соответствовал некоторый «выбрать» предикат:

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) 

Если вы просто хотите, первый элемент, использование Seq.head

let r3 = a |> Seq.head 
+0

Спасибо, я просто попробовал «seq.first» и получил устаревшее сообщение, но никогда не использовал его раньше, поэтому я не знал точного синтаксиса. Seq.hd работает отлично. – esac

+6

FYI, это, кажется, было изменено на 'Seq.head' в F # 2.0. – elo80ka