Una tupla è un raggruppamento immutabile di valori senza nome ma ordinati. Le tuple possono contenere qualsiasi tipo di dato (o più tipi di dati), comprese altre tuple.
Le tuple sono definite come valori separati da virgole tra i caratteri ( e ): (<element_1>, ... , <element_n>).
("one", 2) // Tuple pair (2 values)
("one", 2, true) // Tuple triplet (3 values)
Solo le tuple con la stessa lunghezza e gli stessi tipi (nello stesso ordine) possono essere confrontate. Le tuple hanno uguaglianza strutturale: sono uguali solo se tutti i loro valori sono uguali.
(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
Ci sono tre modi per estrarre valori da una tupla:
fst e 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 e Rui sono compagni di squadra che gareggiano in una caccia al tesoro a tema pirata. Uno ha un elenco di tesori con le coordinate sulla mappa, l'altro un elenco di nomi di luoghi con le coordinate sulla mappa. Hanno anche ricevuto delle mappe vuote con un punto di partenza contrassegnato da SEI QUI.
| Elenco di Azara | Elenco di Rui | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
Ma le cose sono un po' disordinate: le coordinate di Azara sembrano formattate e ordinate diversamente da quelle di Rui, e devono continuare a passare da un elenco all'altro per capire quali tesori vanno con quali luoghi. Da aspiranti programmatori di F#, si sono rivolti a te per scrivere un piccolo programma (in realtà un insieme di funzioni) che organizzi meglio le informazioni della loro caccia.
Implementa la funzione getCooordinate() che prende una coppia (treasure, coordinate) dall'elenco di Azara e restituisce solo la coordinata sulla mappa estratta.
getCoordinate ("Scrimshaw Whale's Tooth", "2A")
// "2A"
Implementa la funzione convertCoordinate() che prende una coordinata nel formato «2A» e restituisce una tupla nel formato (2, 'A').
convertCoordinate "2A"
// (2, 'A')
Implementa la funzione compareRecords() che prende una coppia (treasure, coordinate) e un record (location, coordinate, quadrant) e confronta le coordinate di ciascuno.
Restituisci true se le coordinate «corrispondono» e false se non corrispondono.
Riformatta le coordinate come serve per un confronto accurato.
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 funzione createrecord() che prende una coppia (treasure, coordinate) dall'elenco di Azara e un record (location, coordinate, quadrant) dall'elenco di Rui e restituisce (coordinate, location, quadrant, treasure) se le coordinate corrispondono.
Se le coordinate non corrispondono, restituisci una tupla della stessa forma ma riempita con "".
Riformatta le coordinate come serve per un confronto accurato.
createRecord ("Brass Spyglass", "4B") ("Abandoned Lighthouse", (4, 'B'), "Blue")
// ("4B", "Abandoned Lighthouse", "Blue", "Brass Spyglass")
createRecord ("Brass Spyglass", "4B") ("Seaside Cottages", (1, 'C'), "Blue")
// ("", "", "", "")
Iscriviti a Exercism per imparare e padroneggiare F# con 18 concetti148 esercizi e il mentoring di persone reali, tutto gratis.