2009-03-01 9 views
31

In F # -Code habe ich ein Tupel:ein bestimmtes Element in einem Tupel # F Zugriff auf

let myWife=("Tijana",32) 

ich separat jedes Mitglied des Tupels zugreifen möchten. Zum Beispiel, was das möchte ich mich

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

Dieser Code nicht offensichtlich funktioniert, indem ich denke, zu erreichen, kann es nicht können Sie sammeln, was ich erreichen will.

+2

Es funktioniert nicht, weil der PC Angst hat, das Alter seiner Frau auszuspucken. – Kafo

Antwort

62

Sie möchten verhindern, dass Ihre Frau altert, indem Sie ihr Alter unveränderlich machen? :)

Für ein Tupel, das nur zwei Mitglieder enthält, können Sie und snd die Mitglieder des Paares extrahieren.

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

Für längere Tupel müssen Sie das Tupel in andere Variablen entpacken. Zum Beispiel

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

Eine weitere ganz nützliche Sache, dass Mustervergleich ist (wie wenn Elemente mit „let“ Bindung Extrahieren) kann auch in anderen Situationen verwendet wird, zum Beispiel wenn eine Funktion zu schreiben:

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, ich lese gerade dein Buch;) –

13

Sie können die Funktion fst verwenden, um das erste Element zu erhalten, und snd, um das zweite Element zu erhalten. Sie können auch Ihre eigene 'dritte' Funktion schreiben:

let third (_, _, c) = c 

Lesen Sie mehr hier: F# Language reference, Tuples

+2

+1, aber sicher 'trd' oder' tri' würde mehr idiomatische Namen darstellen :) –

+0

fst und snd funktioniert nicht auf 3-Tupeln. – CodeMonkey

1

Sie können auch eine auspacken Funktion für eine bestimmte Länge schreiben:

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) 

oder

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) 
Verwandte Themen