2009-03-01 26 views
31

Trong F # mã tôi có một tuple:Truy cập vào một thành viên cụ thể trong một F # tuple

let myWife=("Tijana",32) 

tôi muốn truy cập mỗi thành viên của tuple riêng. Ví dụ: điều tôi muốn đạt được bởi tôi không thể

Console.WriteLine("My wife is {0} and her age is {1}",myWife[0],myWife[1]) 

Mã này không rõ ràng, tôi nghĩ bạn có thể thu thập những gì tôi muốn đạt được.

+2

Nó không hoạt động vì máy tính đang sợ khạc nhổ tuổi vợ của bạn. – Kafo

Trả lời

62

Bạn muốn ngăn chặn người vợ của bạn khỏi lão hóa bằng cách làm cho tuổi của mình không thay đổi được? :)

Đối với bộ dữ liệu chỉ chứa hai thành viên, bạn có thể fstsnd để trích xuất các thành viên của cặp.

let wifeName = fst myWife; 
let wifeAge = snd myWife; 

Đối với các bộ dữ liệu dài hơn, bạn sẽ phải giải nén tệp thành các biến khác. Ví dụ,

let _, age = myWife;; 
let name, age = myWife;; 
19

Một điều khá hữu ích là mô hình phù hợp (giống như khi giải nén các yếu tố sử dụng "để" ràng buộc) có thể được sử dụng trong các tình huống khác, ví dụ như khi viết một hàm:

let writePerson1 person = 
    let name, age = person 
    printfn "name = %s, age = %d" name age 

// instead of deconstructing the tuple using 'let', 
// we can do it in the declaration of parameters 
let writePerson2 (name, age) = 
    printfn "name = %s, age = %d" name age 

// in both cases, the call is the same 
writePerson1 ("Joe", 20) 
writePerson2 ("Joe", 20) 
+0

Tom, tôi đang đọc sách của bạn ngay bây giờ;) –

13

Bạn có thể sử dụng hàm fst để lấy phần tử đầu tiên, và snd để lấy ekement thứ hai. Bạn cũng có thể viết riêng chức năng của bạn 'ba':

let third (_, _, c) = c 

đọc thêm ở đây: F# Language reference, Tuples

+2

+1 nhưng chắc chắn 'trd' hoặc' tri' sẽ đại diện cho việc đặt tên thành ngữ hơn :) –

+0

fst và snd không hoạt động trên 3 bộ. – CodeMonkey

1

Bạn cũng có thể viết một chức năng giải nén cho một độ dài nhất định:

let unpack4 tup4 ind = 
    match ind, tup4 with 
    | 0, (a,_,_,_) -> a 
    | 1, (_,b,_,_) -> b 
    | 2, (_,_,c,_) -> c 
    | 3, (_,_,_,d) -> d 
    | _, _ -> failwith (sprintf "Trying to access item %i of tuple with 4 entries." ind) 

hoặc

let unpack4 tup4 ind = 
    let (a, b, c, d) = tup4 
    match ind with 
    | 0 -> a 
    | 1 -> b 
    | 2 -> c 
    | 3 -> d 
    | _ -> failwith (sprintf "Trying to access item %i of tuple with 4 entries." ind) 
Các vấn đề liên quan