Доступ к определенному члену в кортеже F #

В коде F # у меня есть кортеж:

let myWife=("Tijana",32)

Я хочу получить доступ к каждому члену кортежа отдельно. Например, это то, чего я хочу достичь, не могу

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

Этот код явно не работает, я думаю, вы можете понять, чего я хочу достичь.

Ответов (4)

Решение

Вы хотите предотвратить старение своей жены, сделав ее возраст неизменным? :)

Для кортежа, содержащего только два члена, вы можете fst и snd извлечь члены пары.

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

Для более длинных кортежей вам придется распаковать кортеж в другие переменные. Например,

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

Вы также можете написать функцию распаковки для определенной длины:

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) 

или

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) 

Еще одна полезная вещь - сопоставление с образцом (как и при извлечении элементов с помощью привязки let) можно использовать в других ситуациях, например, при написании функции:

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)

Вы можете использовать функцию fst, чтобы получить первый элемент, и snd, чтобы получить второй элемент. Вы также можете написать свою собственную «третью» функцию:

let third (_, _, c) = c

Подробнее здесь: Справочник по языку F #, Кортежи