Кортежи (F#)
Кортеж — это группировка неименованных, но упорядоченных значений, возможно, различных типов.
( element , ... , element )
Заметки
В предыдущей синтаксической конструкции каждый element может быть любым выражением.
Примеры
Примерами кортежей являются пары, тройки и т. п. одного и того же или разных типов.Некоторые примеры показаны в следующем коде.
// Tuple of two integers.
( 1, 2 )
// Triple of strings.
( "one", "two", "three" )
// Tuple of unknown types.
( a, b )
// Tuple that has mixed types.
( "one", 1, 2.0 )
// Tuple of integer expressions.
( a + 1, b + 1)
Получение отдельных значений
Для доступа к элементам кортежа и присвоения им имен можно использовать подбор шаблона, как показано в следующем коде.
let print tuple1 =
match tuple1 with
| (a, b) -> printfn "Pair %A %A" a b
Шаблоны кортежей можно использовать в привязках let следующим образом.
let (a, b) = (1, 2)
Здесь привязываются одновременно значения a и b.Если требуется только один элемент кортежа, можно использовать подстановочный знак (символ подчеркивания) во избежание создания нового имени для ненужной переменной.
let (a, _) = (1, 2)
Функции fst и snd возвращают первый и второй элементы кортежа соответственно.
let c = fst (1, 2)
let d = snd (1, 2)
Встроенной функции, возвращающей третий элемент тройки, нет, однако ее легко написать следующим образом.
let third (_, _, c) = c
В общем случае для доступа к отдельным элементам кортежа лучше использовать подбор шаблона.
Использование кортежей
Кортежи — это удобный способ возвращения из функции сразу нескольких значений, как показано в следующем примере.В этом примере выполняется целочисленное деление и возвращается округленный результат операции в качестве первого члена кортежной пары и остаток в качестве второго члена пары.
let divRem a b =
let x = a / b
let y = a % b
(x, y)
Кортежи также можно использовать в качестве аргументов функций, когда требуется избежать неявного каррирования аргументов функции, что подразумевается обычным синтаксисом функций.
let sumNoCurry (a, b) = a + b
Обычный синтаксис определения функции let sum a b = a + b позволяет определить функцию, являющуюся частичным применением первого аргумента функции, как показано в следующем коде.
let addTen = sum 10
let result = addTen 95
// Result is 105.
Использование кортежа в качестве параметра предотвращает каррирование.Дополнительные сведения см. в пункте "Частичное применение аргументов" раздела Функции (F#).
Имена кортежных типов
При записи имени типа, который является кортежем, для разделения элементов используется символ *.В случае кортежа, состоящего из int, float и string, такого как (10, 10.0, "ten"), тип будет записан следующим образом.
int * float * string
Скомпилированные формы кортежей
Если кортежи используются только из языка F#, не предоставляются коду, написанному на других языках и не предназначены для платформы .NET Framework версии ниже 4, этот раздел можно игнорировать.
Кортежи компилируются в объекты одного из нескольких универсальных типов, все с именем Tuple, которые перегружаются в зависимости от арности или числа параметров типа.Типы кортежей видны в таком виде при просмотре из другого языка, такого как C# или Visual Basic, или при использовании средства, не поддерживающего конструкции языка F#.Типы Tuple были введены в платформе .NET Framework версии 4.Если приложение предназначено для работы с более ранней версией платформы .NET Framework, компилятор использует варианты System.Tuple из версии 2.0 основной библиотеки языка F#.Типы из этой библиотеки используются только для приложений, предназначенных для версий 2.0, 3.0 и 3.5 платформы .NET Framework.Для обеспечения двоичной совместимости между компонентами F# для платформ .NET Framework 2.0 и .NET Framework 4 используется перенаправление типа.