Доступ к конкретному члену в кортеже 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") может использоваться в других ситуациях, например, при написании функции:
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#, Tuples
Вы также можете написать функцию распаковки для определенной длины:
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)