2009-09-26 41 views
9

Tôi đã cố gắng sử dụng Seq.first ngày hôm nay, và trình biên dịch nói rằng nó đã bị phản đối vì lợi ích của Seq.tryPick. Nó nói rằng nó áp dụng một hàm và trả về kết quả đầu tiên trả về một số. Tôi đoán tôi chỉ có thể nói vui vẻ x -> x! = 0 kể từ khi tôi biết người đầu tiên sẽ trả lại Một số trong trường hợp của tôi, nhưng những hạn chế thích hợp để đặt ở đây là gì? Cú pháp chính xác là gì?Làm cách nào để sử dụng tryPick để lấy phần tử đầu tiên của chuỗi?

Để làm rõ, tôi muốn sử dụng nó trong các định dạng:

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

Trả lời

17

Điều quan trọng là 'Seq.first' không trở về phần tử đầu tiên, chứ không phải nó trở lại các yếu tố đầu tiên phù hợp một số vị 'chọn':

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) 

Nếu bạn chỉ muốn phần tử đầu tiên, sử dụng Seq.head

let r3 = a |> Seq.head 
+0

Cảm ơn, tôi vừa thử 'seq.first' và nhận được thông báo không được chấp nhận, nhưng chưa bao giờ sử dụng nó trước đây, vì vậy tôi không biết cú pháp chính xác. Seq.hd hoạt động hoàn hảo. – esac

+6

FYI, điều này dường như đã được thay đổi thành 'Seq.head' trong F # 2.0. – elo80ka

Các vấn đề liên quan