Uma tupla é um agrupamento imutável de valores sem nome, mas ordenados. As tuplas podem conter qualquer tipo de dados (ou vários), incluindo outras tuplas.
As tuplas definem-se como valores separados por vírgulas entre os carateres ( e ): (<element_1>, ... , <element_n>).
("one", 2) // Tuple pair (2 values)
("one", 2, true) // Tuple triplet (3 values)
Só é possível comparar tuplas com o mesmo comprimento e os mesmos tipos (na mesma ordem). As tuplas têm igualdade estrutural, o que significa que só são iguais se todos os seus valores forem iguais.
(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
Há três formas de extrair valores de uma 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
A Azara e o Rui são colegas de equipa numa caça ao tesouro com tema de piratas. Um tem uma lista de tesouros com coordenadas de mapa, o outro tem uma lista de nomes de locais com coordenadas de mapa. Também lhes foram dados mapas em branco com um ponto de partida assinalado com ESTÁS AQUI.
| Lista da Azara | Lista do Rui | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
Mas as coisas estão um pouco desorganizadas: as coordenadas da Azara parecem estar formatadas e ordenadas de forma diferente das do Rui, e têm de andar sempre a olhar de uma lista para a outra para perceber que tesouros correspondem a que locais. Como fsharpies principiantes, vieram pedir-te ajuda para escreveres um pequeno programa (na verdade, um conjunto de funções) que organize melhor a informação da sua caça ao tesouro.
Implementa a função getCooordinate() que recebe um par (treasure, coordinate) da lista da Azara e devolve apenas a coordenada do mapa extraída.
getCoordinate ("Scrimshaw Whale's Tooth", "2A")
// "2A"
Implementa a função convertCoordinate() que recebe uma coordenada no formato "2A" e devolve um tuplo no formato (2, 'A').
convertCoordinate "2A"
// (2, 'A')
Implementa a função compareRecords() que recebe um par (treasure, coordinate) e um registo (location, coordinate, quadrant) e compara as coordenadas de cada um.
Devolve true se as coordenadas coincidirem e false se não coincidirem.
Reformata as coordenadas conforme for necessário para uma comparação exata.
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 a função createrecord() que recebe um par (treasure, coordinate) da lista da Azara e um registo (location, coordinate, quadrant) da lista do Rui e devolve (coordinate, location, quadrant, treasure) se as coordenadas coincidirem.
Se as coordenadas não coincidirem, devolve um tuplo com a mesma forma mas preenchido com "".
Reformata as coordenadas conforme for necessário para uma comparação exata.
createRecord ("Brass Spyglass", "4B") ("Abandoned Lighthouse", (4, 'B'), "Blue")
// ("4B", "Abandoned Lighthouse", "Blue", "Brass Spyglass")
createRecord ("Brass Spyglass", "4B") ("Seaside Cottages", (1, 'C'), "Blue")
// ("", "", "", "")
Inscreve-te no Exercism para aprenderes e dominares F# com 18 conceitos148 exercícios, e mentoria humana real, tudo grátis.