Accediendo a un miembro específico en una tupla F #
Pregunta
En el código F # tengo una tupla:
let myWife=("Tijana",32)
Quiero acceder a cada miembro de la tupla por separado. Por ejemplo, esto es lo que quiero lograr, no puedo
Console.WriteLine("My wife is {0} and her age is {1}",myWife[0],myWife[1])
Este código obviamente no funciona, creo que puedes recopilar lo que quiero lograr.
Solución
¿Quieres evitar que tu esposa envejezca haciendo que su edad sea inmutable? :)
Para una tupla que contiene solo dos miembros, puede fst
y snd
para extraer los miembros de la pareja.
let wifeName = fst myWife;
let wifeAge = snd myWife;
Para tuplas más largas, tendrás que descomprimir la tupla en otras variables. Por ejemplo,
let _, age = myWife;;
let name, age = myWife;;
Otros consejos
Otra cosa muy útil es que la coincidencia de patrones (al igual que cuando se extraen elementos usando " let " vinculación) se puede usar en otras situaciones, por ejemplo, al escribir 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)
Puedes usar la función fst para obtener el primer elemento, y snd para obtener el segundo ekement. También puedes escribir tu propia 'tercera' función:
let third (_, _, c) = c
Lea más aquí: F # Language reference, Tuples
También puede escribir una función de desempaquetar para una cierta 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)