2009-03-01 12 views
31

Nel codice F # Ho un tuple:Accesso a un membro specifico in un F # tupla

let myWife=("Tijana",32) 

voglio accedere ogni membro della tupla separatamente. Per esempio questo ciò che voglio ottenere da non posso

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

Questo codice non funziona, ovviamente, da Penso che si può raccogliere ciò che voglio raggiungere.

+2

Non funziona perché il PC ha paura di sputare fuori l'età di tua moglie. – Kafo

risposta

62

Vuoi impedire a tua moglie di invecchiare rendendo immutabile la sua età? :)

Per una tupla che contiene solo due membri, è possibile fst e snd estrarre i membri della coppia.

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

Per tuple più lunghe, è necessario decomprimere la tupla in altre variabili. Ad esempio,

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

Un'altra cosa molto utile è che il pattern matching (proprio come quando estraendo elementi utilizzando "let" binding) può essere utilizzato in altre situazioni, ad esempio durante la scrittura di una funzione:

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, sto leggendo il tuo libro in questo momento;) –

13

È possibile utilizzare la funzione fst per ottenere il primo elemento e snd per ottenere il secondo valore. È inoltre possibile scrivere la propria funzione 'terzo':

let third (_, _, c) = c 

Read more here: F# Language reference, Tuples

+2

+1 ma sicuramente 'trd' o' tri' rappresenterebbe una denominazione più idiomatica :) –

+0

fst e snd non funziona su 3-tuple. – CodeMonkey

1

È inoltre possibile scrivere una funzione di decompressione per una certa lunghezza:

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) 

o

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) 
Problemi correlati