Una tupla es una agrupación inmutable de valores sin nombre pero ordenados. Las tuplas pueden contener cualquier tipo de dato (o varios), incluidas otras tuplas.
Las tuplas se definen como valores separados por comas entre los caracteres ( y ): (<element_1>, ... , <element_n>).
("one", 2) // Tuple pair (2 values)
("one", 2, true) // Tuple triplet (3 values)
Solo se pueden comparar las tuplas que tienen la misma longitud y los mismos tipos (en el mismo orden). Las tuplas tienen igualdad estructural, lo que significa que son iguales solo si todos sus valores son iguales.
(1, 2) = (1, 2) // Same length, same types, same values, same order
// => true
(1, 2) = (2, 1) // Same length, same types, same values, different order
// => false
(1, 2) = (1, "2") // Same length, different types
// compiler error
(1, 2) = (1, 2, 3) // Different length
// compiler error
Hay tres maneras de extraer valores de una tupla:
fst y snd
let person = ("Jordan", 170)
// Option 1: fst/snd
let name1 = fst person
let length2 = snd person
// Option 2: deconstruction
let (name2, length2) = person
// => name2 = "Jordan"
// => length2 = 170
// Option 3: pattern matching
match person with
| name3, length3 -> printf "%s: %d" name3 length3
Azara y Rui son compañeros de equipo que compiten en una búsqueda del tesoro con temática pirata. Uno tiene una lista de tesoros con coordenadas del mapa y el otro una lista de nombres de lugares con coordenadas del mapa. También les dieron mapas en blanco con un lugar de partida marcado con AQUÍ ESTÁS.
| La lista de Azara | La lista de Rui | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
Pero las cosas están un poco desordenadas: las coordenadas de Azara parecen tener otro formato y otro orden que las de Rui, y tienen que estar mirando de una lista a la otra para descubrir qué tesoros van con qué lugares. Como son unos fsharpies en ciernes, han acudido a ti para que les ayudes a escribir un pequeño programa (en realidad, un conjunto de funciones) que organice mejor la información de su búsqueda.
Implementa la función getCooordinate(), que toma un par (treasure, coordinate) de la lista de Azara y devuelve únicamente la coordenada del mapa extraída.
getCoordinate ("Scrimshaw Whale's Tooth", "2A")
// "2A"
Implementa la función convertCoordinate(), que toma una coordenada con el formato "2A" y devuelve una tupla con el formato (2, 'A').
convertCoordinate "2A"
// (2, 'A')
Implementa la función compareRecords(), que toma un par (treasure, coordinate) y un registro (location, coordinate, quadrant) y compara las coordenadas de cada uno.
Devuelve true si las coordenadas «coinciden» y devuelve false si no.
Vuelve a darles formato a las coordenadas según haga falta para compararlas con exactitud.
compareRecords ("Brass Spyglass", "4B") ("Seaside Cottages", (1, 'C'), "blue")
// false
compareRecords ("Model Ship in Large Bottle", "8A") ("Harbor Managers Office", (8, 'A'), "purple")
// true
Implementa la función createrecord(), que toma un par (treasure, coordinate) de la lista de Azara y un registro (location, coordinate, quadrant) de la lista de Rui y devuelve (coordinate, location, quadrant, treasure) si las coordenadas coinciden.
Si las coordenadas no coinciden, devuelve una tupla de la misma forma pero rellena de "".
Vuelve a darles formato a las coordenadas según haga falta para compararlas con exactitud.
createRecord ("Brass Spyglass", "4B") ("Abandoned Lighthouse", (4, 'B'), "Blue")
// ("4B", "Abandoned Lighthouse", "Blue", "Brass Spyglass")
createRecord ("Brass Spyglass", "4B") ("Seaside Cottages", (1, 'C'), "Blue")
// ("", "", "", "")
Regístrate en Exercism para aprender y dominar F# con 18 conceptos148 ejercicios y mentoría humana real, todo gratis.