Поделиться через


Кортежи (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 используется перенаправление типа.

См. также

Другие ресурсы

Справочник по языку F#

Типы языка F#