يمكن للصفوف في Elm أن تحمل قيمتين أو ثلاث قيم، ويمكن أن تكون كل قيمة من أي نوع. وفي Elm، تُستخدم الصفوف غالبًا لأنواع مؤقتة بسيطة. ولهذا السبب لا تحمل الصفوف أكثر من 3 قيم، وكمزيد من التشجيع لا تُوفَّر دوال مساعدة إلا لقيمتين. أما للبيانات الأكثر تعقيدًا، فمن الأفضل الانتقال إلى السجلات.
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)) وتُرجع true إذا كان مطابقًا لـ 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)))، وتُرجع true في التركيبات التالية:
جرّب تنفيذ هذه الدالة كجملة case مع زوج مرتّب مخصّص، بدلًا من استخدام الجمل الشرطية if (وهذا أسلوب شائع في Elm).
سجّل في Exercism لتتعلّم وتتقن Elm عبر 28 مفهومًا110 تمارين، وإرشاد بشري حقيقي، وكل ذلك مجانًا.