Кортежі в Elm можуть містити два або три значення, і кожне з них може мати будь-який тип. В Elm кортежі переважно використовують для простих тимчасових типів. Тому кортежі мають максимум 3 значення, а як додатковий стимул зручні функції передбачено лише для 2 значень. Для складніших даних краще перейти на записи.
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"
Кортежі можна деструктурувати у привʼязках за допомогою зіставлення зі зразком. Деструктурування можна виконувати у виразах let, оголошеннях функцій і конструкціях 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 та Rui розробляють піратський квест з пошуку скарбів. Є список скарбів із зазначенням їхніх розташувань на карті, а також список назв місць із зазначенням їхніх розташувань.
| Скарб | Розташування |
|---|---|
| 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) |
| Назва місця | Розташування | Квадрант |
|---|---|---|
| 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 |
Гравці подорожують картою і дорогою збирають скарби. Розташування скарбів і місць записано по-різному, щоб додати додаткову складність. Є також особливі місця, де одні скарби можна обміняти на інші, щоб додати грі ще одну цікавинку. Наше завдання - написати функції, які допоможуть їм у цій грі.
Реалізуйте функцію placeLocationToTreasureLocation, яка приймає розташування місця (наприклад, ('C', 1)) і перетворює його на розташування скарбу (наприклад, (1, 'C')).
placeLocationToTreasureLocation ('C', 1)
--> (1,'C')
Реалізуйте функцію treasureLocationMatchesPlaceLocation, яка приймає PlaceLocation (наприклад, ('C', 1)) і повертає правду, якщо воно збігається з TreasureLocation (наприклад, (1, 'C')).
treasureLocationMatchesPlaceLocation ('C', 1) (1, 'C')
--> true
treasureLocationMatchesPlaceLocation ('C', 1) (2, 'C')
--> false
Реалізуйте функцію countPlaceTreasures, яка приймає місце (наприклад, ("Aqua Lagoon (Island of Mystery)", ('F', 1))) і список скарбів, та повертає кількість скарбів, які можна там знайти.
place = ("Aqua Lagoon (Island of Mystery)", ('F', 1))
countPlaceTreasures place treasures =
--> 2
Реалізуйте функцію specialCaseSwapPossible, яка приймає скарб (наприклад, ("Amethyst Octopus", (1, 'F'))) і місце (наприклад, ("Seaside Cottages ", ('C', 1))), та повертає правду для таких комбінацій:
Спробуйте реалізувати цю функцію як конструкцію case зі спеціально створеним кортежем, а не через умовні конструкції if (це поширена ідіома в Elm).
Зареєструйтеся на Exercism, щоб вивчати й опановувати Elm, а також 28 концепцій110 вправ та справжнє наставництво від людей, і все це безкоштовно.