Tuplas (F#)

Una tupla es una agrupación de valores sin nombre pero ordenados, posiblemente de tipos diferentes.

( element , ... , element ) 

Comentarios

Cada element de la sintaxis anterior puede ser cualquier expresión.

Ejemplos

Algunos ejemplos de tuplas son los pares, los triples, etc., del mismo tipo o de tipos diferentes. En el siguiente código se incluyen algunos ejemplos.

// 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) 

Obtener valores individuales

Se puede utilizar la coincidencia de modelos para obtener acceso a los elementos de las tuplas y asignarles nombres, tal y como se muestra en el siguiente código.

let print tuple1 =
   match tuple1 with
    | (a, b) -> printfn "Pair %A %A" a b

Los modelos de tupa se pueden utilizar en los enlaces let, tal y como se muestra a continuación.

let (a, b) = (1, 2)

De este modo, se enlazan los valores a y b al mismo tiempo. Si solo se necesita un elemento de la tupla, se puede utilizar el carácter comodín (subrayado) a fin de evitar que se cree un nuevo nombre para una variable que no se precisa.

let (a, _) = (1, 2)

Las funciones fst y snd devuelven los elementos primero y segundo de una tupla, respectivamente.

let c = fst (1, 2)
let d = snd (1, 2)

No hay ninguna función integrada que devuelva el tercer elemento de un triple, pero resulta fácil escribirla, tal y como se muestra a continuación.

let third (_, _, c) = c

En general, es preferible utilizar la coincidencia de modelos para tener acceso a los elementos de tupla individuales.

Utilizar tuplas

Las tuplas son una manera cómoda de devolver varios valores de una función, tal y como se muestra en el ejemplo siguiente. En este ejemplo, se realiza una división de enteros y se devuelve el resultado redondeado de la operación como primer miembro de una tupla de dos elementos y el resto como segundo miembro del par.

let divRem a b = 
   let x = a / b
   let y = a % b
   (x, y)

Las tuplas también se pueden utilizar como argumentos de función cuando se desea evitar la currificación implícita de los argumentos de función que la sintaxis de función habitual halla implícitamente.

let sumNoCurry (a, b) = a + b

La sintaxis usual para definir la función let sum a b = a + b permite definir una función que es la aplicación parcial del primer argumento de la función, tal y como se muestra en el siguiente código.

let addTen = sum 10
let result = addTen 95  
// Result is 105.

El uso de una tupla como parámetro deshabilita la currificación. Para obtener más información, vea "Aplicación parcial de argumentos" en Funciones (F#).

Nombres de tipos de tupla

Al escribir el nombre de un tipo que es una tupla, se utiliza el símbolo * para separar los elementos. Para una tupla que consta de un valor de tipo int, float y string, como (10, 10.0, "ten"), el tipo se escribiría de la siguiente manera:

int * float * string

Formato compilado de tuplas

Puede omitir esta sección si solo usa tuplas de F#, no las expone a otros lenguajes y no ha elegido como destino una versión de .NET Framework anterior a la versión 4.

Las tuplas se compilan en objetos de uno de varios tipos genéricos, denominados Tuple, que se sobrecargan por aridad o el número de parámetros de tipo. Los tipos de tupla aparecen de esta forma cuando se ven en otro lenguaje, como C# o Visual Basic, o cuando se usa una herramienta que no reconoce las construcciones de F#. Los tipos Tuple se incluyen por primera vez en .NET Framework 4. Si usa como destino una versión anterior de .NET Framework, el compilador usará el tipo System.Tuple de la versión 2.0 de la biblioteca básica de F#. Los tipos de esta biblioteca se utilizan únicamente para aplicaciones destinadas a las versiones 2.0, 3.0 y 3.5 de .NET Framework. Se utiliza el reenvío de tipos para garantizar la compatibilidad binaria entre .NET Framework 2.0 y los componentes de F# en .NET Framework 4.

Vea también

Otros recursos

Referencia del lenguaje F#

Tipos en F#