2009-03-01 6 views
31

En F # code J'ai un tuple:Accès à un membre spécifique dans un F # tuple

let myWife=("Tijana",32) 

Je veux accéder à chaque membre du tuple séparément. Par exemple ce que je veux réaliser par je ne peux pas

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

Ce code ne fonctionne évidemment pas, par je pense que vous pouvez recueillir ce que je veux atteindre.

+2

Cela ne fonctionne pas parce que le PC a peur de cracher l'âge de votre femme. – Kafo

Répondre

62

Vous voulez empêcher votre femme de vieillir en rendant son âge immuable? :)

Pour un tuple ne contenant que deux membres, vous pouvez fst et snd d'extraire les membres de la paire.

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

Pour les tuples plus longs, vous devrez décompresser le tuple dans d'autres variables. Par exemple,

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

Une autre chose très utile est que la correspondance de motif (tout comme lors de l'extraction des éléments à l'aide de « laisser » la liaison) peut être utilisé dans d'autres situations, par exemple lors de l'écriture d'une fonction:

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, je lis votre livre en ce moment;) –

13

Vous pouvez utiliser la fonction fst pour obtenir le premier élément et snd pour obtenir le deuxième élément. Vous pouvez également écrire votre propre 'troisième' fonction:

let third (_, _, c) = c 

En savoir plus ici: F# Language reference, Tuples

+2

+1 mais sûrement 'trd' ou' tri' représenterait un nom plus idiomatique :) –

+0

fst et snd ne fonctionne pas sur 3-tuples. – CodeMonkey

1

Vous pouvez également écrire une fonction déballer pour une certaine longueur:

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) 

ou

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) 
Questions connexes