Tupel in Elm können zwei oder drei Werte enthalten, und jeder Wert kann einen beliebigen Typ haben. In Elm werden Tupel meist für einfache, kurzlebige Typen verwendet. Deshalb haben Tupel höchstens 3 Werte, und um das noch zu unterstreichen, gibt es Komfortfunktionen nur für 2 Werte. Für komplexere Daten wechselst du am besten zu 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"
Tupel lassen sich in Bindungen mithilfe von Musterabgleich destrukturieren. Destrukturieren ist in let-Ausdrücken, Funktionsdeklarationen und case-Anweisungen möglich.
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 und Rui entwerfen eine Schatzsuche mit Piratenmotiv. Die eine Liste enthält Schätze mit ihren Positionen auf der Karte, die andere Ortsnamen mit ihren Positionen auf der Karte.
| Schatz | Position |
|---|---|
| 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) |
| Ortsname | Position | 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 |
Die Spieler reisen über die Karte und sammeln unterwegs Schätze ein. Die Positionen von Schätzen und von Orten sind unterschiedlich formatiert, damit es eine zusätzliche Herausforderung gibt. Außerdem gibt es einige besondere Orte, an denen bestimmte Schätze gegen bestimmte andere getauscht werden können, um dem Spiel eine zusätzliche Wendung zu geben. Deine Aufgabe ist es, Funktionen zu schreiben, die ihnen bei ihrem Spiel helfen.
Implementiere die Funktion placeLocationToTreasureLocation. Sie nimmt eine Orts-Position (zum Beispiel ('C', 1)) und wandelt sie in eine Schatz-Position (zum Beispiel (1, 'C')) um.
placeLocationToTreasureLocation ('C', 1)
--> (1,'C')
Implementiere die Funktion treasureLocationMatchesPlaceLocation. Sie nimmt eine PlaceLocation (zum Beispiel ('C', 1)) und gibt wahr zurück, wenn sie zu einer TreasureLocation (zum Beispiel (1, 'C')) passt.
treasureLocationMatchesPlaceLocation ('C', 1) (1, 'C')
--> true
treasureLocationMatchesPlaceLocation ('C', 1) (2, 'C')
--> false
Implementiere die Funktion countPlaceTreasures. Sie nimmt einen Ort (zum Beispiel ("Aqua Lagoon (Island of Mystery)", ('F', 1))) und die Liste der Schätze und gibt die Anzahl der Schätze zurück, die dort zu finden sind.
place = ("Aqua Lagoon (Island of Mystery)", ('F', 1))
countPlaceTreasures place treasures =
--> 2
Implementiere die Funktion specialCaseSwapPossible. Sie nimmt einen Schatz (zum Beispiel ("Amethyst Octopus", (1, 'F'))) und einen Ort (zum Beispiel ("Seaside Cottages ", ('C', 1))) und gibt für die folgenden Kombinationen wahr zurück:
Versuche, diese Funktion als case-Anweisung mit einem Ad-hoc-Tupel zu implementieren, statt if-Anweisungen zu verwenden (das ist ein gängiges Idiom in Elm).
Melde dich bei Exercism an, um Elm mit 28 Konzepte110 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.