In Elm, le tuple possono contenere due o tre valori, e ogni valore può avere qualsiasi tipo. In Elm, le tuple si usano per lo più per tipi transitori semplici. Per questo motivo le tuple hanno un massimo di 3 valori e, come ulteriore incoraggiamento, le funzioni di comodo sono fornite solo per 2 valori. Per dati più complessi, è meglio passare ai record.
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"
Le tuple possono essere destrutturate nei binding usando il pattern matching sulle tuple. La destrutturazione può essere fatta nelle espressioni let, nelle dichiarazioni di funzione e nelle istruzioni 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 stanno progettando una caccia al tesoro a tema pirata. C'è una lista di tesori con le posizioni sulla mappa, e un'altra lista di nomi di luoghi con le posizioni sulla mappa.
| Tesoro | Posizione |
|---|---|
| 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 del luogo | Posizione | Quadrante |
|---|---|---|
| Seaside Cottages | (C, 1) | Blue |
| Aqua Lagoon (Island of Mystery) | (F, 1) | Yellow |
| Deserted Docks | (A, 2) | Blue |
| Spiky Rocks | (D, 3) | Yellow |
| Abandoned Lighthouse | (B, 4) | Blue |
| Hidden Spring (Island of Mystery) | (E, 4) | Yellow |
| Stormy Breakwater | (B, 5) | Purple |
| Old Schooner | (A, 6) | Purple |
| Tangled Seaweed Patch | (D, 6) | Orange |
| Quiet Inlet (Island of Mystery) | (E, 7) | Orange |
| Windswept Hilltop (Island of Mystery) | (F, 7) | Orange |
| Harbor Managers Office | (A, 8) | Purple |
| Foggy Seacave | (C, 8) | Purple |
I giocatori viaggeranno sulla mappa raccogliendo tesori man mano che avanzano. Le posizioni dei tesori e dei luoghi sono formattate in modo diverso, per aggiungere una sfida in più. Ci sono anche alcuni luoghi speciali, dove certi tesori si possono scambiare con certi altri, per aggiungere un ulteriore tocco di imprevedibilità al gioco. Il tuo compito è scrivere delle funzioni per aiutarli nel loro gioco.
Implementa la funzione placeLocationToTreasureLocation, che prende una posizione di un luogo (come ('C', 1)) e la converte in una posizione di un tesoro (come (1, 'C')).
placeLocationToTreasureLocation ('C', 1)
--> (1,'C')
Implementa la funzione treasureLocationMatchesPlaceLocation, che prende una PlaceLocation (come ('C', 1)) e restituisce true se corrisponde a una TreasureLocation (come (1, 'C')).
treasureLocationMatchesPlaceLocation ('C', 1) (1, 'C')
--> true
treasureLocationMatchesPlaceLocation ('C', 1) (2, 'C')
--> false
Implementa la funzione countPlaceTreasures, che prende un luogo (come ("Aqua Lagoon (Island of Mystery)", ('F', 1))) e l'array dei tesori, e restituisce il numero di tesori che si possono trovare lì.
place = ("Aqua Lagoon (Island of Mystery)", ('F', 1))
countPlaceTreasures place treasures =
--> 2
Implementa la funzione specialCaseSwapPossible, che prende un tesoro (come ("Amethyst Octopus", (1, 'F'))) e un luogo (come ("Seaside Cottages ", ('C', 1))), e restituisce true per le seguenti combinazioni:
Prova a implementare questa funzione come un'istruzione case con una tupla ad hoc, invece di usare istruzioni if (è un idioma comune in Elm).
Iscriviti a Exercism per imparare e padroneggiare Elm con 28 concetti110 esercizi e il mentoring di persone reali, tutto gratis.