A tuple névtelen, de rendezett értékek módosíthatatlan csoportosítása. A tuple-ök bármilyen (vagy többféle) adattípust tárolhatnak, akár más tuple-öket is.
A tuple-öket a ( és ) karakterek között álló, vesszővel elválasztott értékekként definiáljuk: (<element_1>, ... , <element_n>).
("one", 2) // Tuple pair (2 values)
("one", 2, true) // Tuple triplet (3 values)
Csak az azonos hosszúságú és azonos típusokból (ugyanabban a sorrendben) álló tuple-ök hasonlíthatók össze. A tuple-ök szerkezeti egyenlőséggel rendelkeznek, ami azt jelenti, hogy csak akkor egyenlők, ha minden értékük egyenlő.
(1, 2) = (1, 2) // Same length, same types, same values, same order
// => true
(1, 2) = (2, 1) // Same length, same types, same values, different order
// => false
(1, 2) = (1, "2") // Same length, different types
// compiler error
(1, 2) = (1, 2, 3) // Different length
// compiler error
Háromféleképpen nyerhetsz ki értékeket egy tuple-ből:
fst és snd függvényeklet person = ("Jordan", 170)
// Option 1: fst/snd
let name1 = fst person
let length2 = snd person
// Option 2: deconstruction
let (name2, length2) = person
// => name2 = "Jordan"
// => length2 = 170
// Option 3: pattern matching
match person with
| name3, length3 -> printf "%s: %d" name3 length3
Azara és Rui csapattársak, akik egy kalóztémájú kincsvadászaton versenyeznek. Az egyiküknél a kincsek listája van térképkoordinátákkal, a másikuknál a helyszínnevek listája térképkoordinátákkal. Ezenkívül kaptak üres térképeket, amelyeken egy kiindulópont van megjelölve: ITT VAGY.
| Azara listája | Rui listája | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
De a dolgok kissé rendezetlenek: úgy tűnik, Azara koordinátái másképp vannak formázva és rendezve, mint Ruiéi, és folyton egyik listáról a másikra kell pillantaniuk, hogy kitalálják, melyik kincs melyik helyszínhez tartozik. Mivel feltörekvő fsharp-osok, hozzád fordultak segítségért, hogy írj egy kis programot (valójában függvények egy csoportját), amellyel jobban rendszerezhetik a vadászat adatait.
Valósítsd meg a getCooordinate() függvényt, amely átvesz egy (treasure, coordinate) párt Azara listájáról, és csak a kinyert térképkoordinátát adja vissza.
getCoordinate ("Scrimshaw Whale's Tooth", "2A")
// "2A"
Valósítsd meg a convertCoordinate() függvényt, amely átvesz egy "2A" formátumú koordinátát, és egy (2, 'A') formátumú tuple-t ad vissza.
convertCoordinate "2A"
// (2, 'A')
Valósítsd meg a compareRecords() függvényt, amely átvesz egy (treasure, coordinate) párt és egy (location, coordinate, quadrant) rekordot, majd összehasonlítja a bennük lévő koordinátákat.
Add vissza a true értéket, ha a koordináták „egyeznek”, és a false értéket, ha nem.
A pontos összehasonlításhoz formázd át a koordinátákat, ahogy szükséges.
compareRecords ("Brass Spyglass", "4B") ("Seaside Cottages", (1, 'C'), "blue")
// false
compareRecords ("Model Ship in Large Bottle", "8A") ("Harbor Managers Office", (8, 'A'), "purple")
// true
Valósítsd meg a createrecord() függvényt, amely átvesz egy (treasure, coordinate) párt Azara listájáról és egy (location, coordinate, quadrant) rekordot Rui listájáról, majd visszaadja a (coordinate, location, quadrant, treasure) értéket, ha a koordináták egyeznek.
Ha a koordináták nem egyeznek, adj vissza egy ugyanilyen alakú tuple-t, de "" értékekkel kitöltve.
A pontos összehasonlításhoz formázd át a koordinátákat, ahogy szükséges.
createRecord ("Brass Spyglass", "4B") ("Abandoned Lighthouse", (4, 'B'), "Blue")
// ("4B", "Abandoned Lighthouse", "Blue", "Brass Spyglass")
createRecord ("Brass Spyglass", "4B") ("Seaside Cottages", (1, 'C'), "Blue")
// ("", "", "", "")
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) F# nyelvet 18 fogalom148 feladat segítségével, valódi emberi mentorálással, mindez ingyen.