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'))匹配就返回 true。
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 中常见的惯用法)。