2009-03-01 19 views
31

En F # código que tengo una tupla:Acceso a un miembro específico en un F # tupla

let myWife=("Tijana",32) 

quiero acceder a cada miembro de la tupla por separado. Por ejemplo esto lo que quiere lograr, no puedo

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

Este código no funciona, obviamente, por Creo que se puede recoger lo que quiero lograr.

+2

No funciona porque la PC tiene miedo de escupir la edad de su esposa. – Kafo

Respuesta

62

¿Desea evitar que su esposa envejezca haciendo que su edad sea inmutable? :)

Para una tupla que contiene solo dos miembros, puede fst y snd para extraer los miembros del par.

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

Para tuplas más largas, tendrá que desempaquetar la tupla en otras variables. Por ejemplo,

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

Otra cosa bastante útil es que la coincidencia de patrones (al igual que cuando la extracción de elementos usando "dejar" vinculante) se puede utilizar en otras situaciones, por ejemplo cuando se escribe una función:

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, estoy leyendo su libro ahora;) –

13

Puede usar la función fst para obtener el primer elemento, y snd para obtener el segundo ekement. También puede escribir su propia 'tercer' función:

let third (_, _, c) = c 

Lee más aquí: F# Language reference, Tuples

+2

+1 pero seguramente 'trd' o' tri' representaría más nombres idiomáticos :) –

+0

fst y snd no funciona en 3-tuplas. – CodeMonkey

1

También puede escribir una función de desempaquetado para una determinada longitud:

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) 
Cuestiones relacionadas