Les tuples en Elm peuvent contenir deux ou trois valeurs, et chaque valeur peut être de n'importe quel type. En Elm, les tuples servent surtout à des types transitoires simples. C'est pourquoi les tuples comportent au maximum 3 valeurs, et pour t'encourager davantage, seules des fonctions utilitaires pour 2 valeurs sont fournies. Pour des données plus complexes, il vaut mieux passer aux records.
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"
Les tuples peuvent être déstructurés dans des liaisons à l'aide du filtrage par motif de tuple.
La déstructuration peut se faire dans des expressions let, des déclarations de fonction et des expressions 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 et Rui conçoivent une chasse au trésor sur le thème des pirates. Il y a d'un côté une liste de trésors avec leurs emplacements sur la carte, et de l'autre une liste de noms de lieux avec leurs emplacements sur la carte.
| Treasure | Emplacement |
|---|---|
| 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) |
| Place Name | Emplacement | Quadrant |
|---|---|---|
| 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 |
Les joueurs parcourent la carte et ramassent des trésors en chemin. Les emplacements de trésor et de lieu ont un format différent, pour ajouter un défi supplémentaire. Il y a aussi quelques lieux spéciaux, où certains trésors peuvent être échangés contre certains autres, pour ajouter un rebondissement supplémentaire au jeu. Ta mission est d'écrire des fonctions pour les aider dans leur jeu.
Implémente la fonction placeLocationToTreasureLocation qui prend un emplacement de lieu (comme ('C', 1)) et le convertit en emplacement de trésor (comme (1, 'C')).
placeLocationToTreasureLocation ('C', 1)
--> (1,'C')
Implémente la fonction treasureLocationMatchesPlaceLocation qui prend un PlaceLocation (comme ('C', 1)) et renvoie vrai s'il correspond à un TreasureLocation (comme (1, 'C')).
treasureLocationMatchesPlaceLocation ('C', 1) (1, 'C')
--> true
treasureLocationMatchesPlaceLocation ('C', 1) (2, 'C')
--> false
Implémente la fonction countPlaceTreasures, qui prend un lieu (comme ("Aqua Lagoon (Island of Mystery)", ('F', 1))) et la liste des trésors, et renvoie le nombre de trésors que l'on peut y trouver.
place = ("Aqua Lagoon (Island of Mystery)", ('F', 1))
countPlaceTreasures place treasures =
--> 2
Implémente la fonction specialCaseSwapPossible, qui prend un trésor (comme ("Amethyst Octopus", (1, 'F'))) et un lieu (comme ("Seaside Cottages ", ('C', 1))), et renvoie vrai pour les combinaisons suivantes :
Essaie d'implémenter cette fonction sous la forme d'une instruction case avec un tuple ad hoc, plutôt que d'utiliser des instructions if (c'est un idiome courant en Elm).
Inscris-toi sur Exercism pour apprendre et maîtriser Elm avec 28 concepts110 exercices, et un vrai mentorat humain, le tout gratuitement.