As tuplas em Elm podem guardar dois ou três valores, e cada valor pode ter qualquer tipo. No Elm, as tuplas são usadas principalmente para tipos simples e transitórios. Por esse motivo, as tuplas têm no máximo 3 valores e, para reforçar isso, só existem funções auxiliares para 2 valores. Para dados mais complexos, é melhor usar registros.
type alias IntStringTuple = (Int, String)
aTuple : IntStringTuple
aTuple = (123, "elements can be of differing types")
anotherTuple : (String, String)
anotherTuple = Tuple.pair "this time it's" "two strings"
--> ("this time it's", "two strings")
Tuple.first aTuple
--> 123
Tuple.second aTuple
--> "elements can be of differing types"
As tuplas podem ser desestruturadas em vinculações usando correspondência de padrões de tupla. A desestruturação pode ser feita em expressões let, declarações de função e instruções case.
repeatString : (Int, String) -> Bool
repeatString aTuple =
let
(aNumber, aString) = aTuple
in
String.repeat aNumber aString
repeatStringAgain : (Int, String) -> Bool
repeatStringAgain (aNumber, aString) = String.repeat aNumber aString
has123 : (Int, String, Bool) -> Bool
has123 aTuple =
case aTuple of
(123, _, _) ->
True
(_, "123", _) ->
True
(_, _, True) ->
True
_ ->
False
Aazra e Rui estão criando uma caça ao tesouro com tema de piratas. Um deles tem uma lista de tesouros com localizações no mapa, e o outro tem uma lista de nomes de lugares com localizações no mapa.
| Tesouro | Localização |
|---|---|
| Amethyst Octopus | (1, F) |
| Angry Monkey Figurine | (5, B) |
| Antique Glass Fishnet Float | (3, D) |
| Brass Spyglass | (4, B) |
| Carved Wooden Elephant | (8, C) |
| Crystal Crab | (6, A) |
| Glass Starfish | (6, D) |
| Model Ship in Large Bottle | (8, A) |
| Pirate Flag | (7, F) |
| Robot Parrot | (1, C) |
| Scrimshaw Whale's Tooth | (1, F) |
| Silver Seahorse | (4, E) |
| Vintage Pirate Hat | (7, E) |
| Nome do lugar | Localização | Quadrante |
|---|---|---|
| Seaside Cottages | (C, 1) | Azul |
| Aqua Lagoon (Island of Mystery) | (F, 1) | Amarelo |
| Deserted Docks | (A, 2) | Azul |
| Spiky Rocks | (D, 3) | Amarelo |
| Abandoned Lighthouse | (B, 4) | Azul |
| Hidden Spring (Island of Mystery) | (E, 4) | Amarelo |
| Stormy Breakwater | (B, 5) | Roxo |
| Old Schooner | (A, 6) | Roxo |
| Tangled Seaweed Patch | (D, 6) | Laranja |
| Quiet Inlet (Island of Mystery) | (E, 7) | Laranja |
| Windswept Hilltop (Island of Mystery) | (F, 7) | Laranja |
| Harbor Managers Office | (A, 8) | Roxo |
| Foggy Seacave | (C, 8) | Roxo |
Os jogadores vão percorrer o mapa pegando tesouros pelo caminho. As localizações de tesouros e de lugares são escritas de formas diferentes, para deixar o desafio ainda maior. Também existem alguns lugares especiais, onde certos tesouros podem ser trocados por outros, o que dá uma reviravolta extra ao jogo. Sua tarefa é escrever funções que ajudem os dois com o jogo.
Implemente a função placeLocationToTreasureLocation, que recebe uma localização de lugar (como ('C', 1)) e a converte em uma localização de tesouro (como (1, 'C')).
placeLocationToTreasureLocation ('C', 1)
--> (1,'C')
Implemente a função treasureLocationMatchesPlaceLocation, que recebe uma PlaceLocation (como ('C', 1)) e retorna true se ela corresponder a uma TreasureLocation (como (1, 'C')).
treasureLocationMatchesPlaceLocation ('C', 1) (1, 'C')
--> true
treasureLocationMatchesPlaceLocation ('C', 1) (2, 'C')
--> false
Implemente a função countPlaceTreasures, que recebe um lugar (como ("Aqua Lagoon (Island of Mystery)", ('F', 1))) e a lista de tesouros, e retorna quantos tesouros podem ser encontrados ali.
place = ("Aqua Lagoon (Island of Mystery)", ('F', 1))
countPlaceTreasures place treasures =
--> 2
Implemente a função specialCaseSwapPossible, que recebe um tesouro (como ("Amethyst Octopus", (1, 'F'))) e um lugar (como ("Seaside Cottages ", ('C', 1))), e retorna true para as seguintes combinações:
Tente implementar essa função como uma instrução case com uma tupla ad hoc, em vez de usar condicionais if (esse é um idioma comum em Elm).
Crie sua conta no Exercism para aprender e dominar Elm com 28 conceitos110 exercícios e mentoria humana de verdade, tudo de graça.