تاپلها در Elm میتوانند دو یا سه مقدار را در خود نگه دارند و هر مقدار میتواند هر نوعی داشته باشد. در Elm، تاپلها بیشتر برای انواع گذرای ساده به کار میروند. به همین دلیل تاپلها حداکثر ۳ مقدار را نگه میدارند و برای تشویق بیشتر، توابع کمکی فقط برای ۲ مقدار ارائه شدهاند. برای دادههای پیچیدهتر، بهتر است به رکوردها روی بیاورید.
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
آزرا و روی در حال طراحی یک شکار گنج با حالوهوای دزدان دریایی هستند. یک فهرست از گنجها همراه با موقعیتشان روی نقشه وجود دارد و فهرست دیگری از نام مکانها همراه با موقعیتشان روی نقشه.
| Treasure | Location |
|---|---|
| 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 | Location | 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 |
بازیکنان روی نقشه میگردند و در طول مسیرشان گنجها را برمیدارند. قالب موقعیت گنجها و موقعیت مکانها با هم فرق دارد تا چالش بیشتری به بازی اضافه شود. چند مکان ویژه هم وجود دارد که در آنها میتوان بعضی گنجها را با بعضی گنجهای دیگر عوض کرد تا پیچش بیشتری به بازی داده شود. کار شما این است که توابعی بنویسید تا در ساخت این بازی به آنها کمک کنید.
تابع 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))) میگیرد و برای ترکیبهای زیر «درست» را برمیگرداند:
سعی کنید این تابع را بهجای دستورهای if، بهصورت یک دستور case با یک تاپل موردی پیادهسازی کنید (این یکی از الگوهای رایج در Elm است).