تاپل یک گروه تغییرناپذیر از مقادیری است که بینام اما مرتباند. تاپل میتواند هر نوع دادهای (یا چندین نوع داده) را در خود نگه دارد، از جمله تاپلهای دیگر.
تاپلها بهصورت مقادیری تعریف میشوند که با کاما از هم جدا شدهاند و بین کاراکترهای ( و ) قرار میگیرند: (<element_1>, ... , <element_n>).
("one", 2) // Tuple pair (2 values)
("one", 2, true) // Tuple triplet (3 values)
فقط تاپلهایی را میتوان با هم مقایسه کرد که طول یکسان و نوعهای یکسان (با ترتیب یکسان) داشته باشند. تاپلها برابری ساختاری دارند، یعنی فقط وقتی برابرند که همهی مقدارهایشان برابر باشند.
(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
سه راه برای استخراج مقدارها از یک تاپل وجود دارد:
fst و snd
let 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 و Rui همتیمیهایی هستند که در یک شکار گنج با مضمون دزدان دریایی با هم رقابت میکنند. یکی فهرستی از گنجها همراه با مختصات نقشه دارد و دیگری فهرستی از نام مکانها همراه با مختصات نقشه. نقشههای خالی هم به آنها داده شده که روی هرکدام محل شروع با عبارت «شما اینجا هستید» علامت خورده است.
| فهرست Azara | فهرست Rui | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
اما همهچیز کمی نامرتب است: به نظر میرسد مختصاتهای Azara با مختصاتهای Rui متفاوت قالببندی و مرتب شدهاند و آنها باید مدام از یک فهرست به فهرست دیگر نگاه کنند تا بفهمند کدام گنجها به کدام مکانها مربوطاند. چون تازهکارهای F# هستند، پیش شما آمدهاند تا برای نوشتن یک برنامهی کوچک (در واقع مجموعهای از توابع) که اطلاعات شکارشان را بهتر سازماندهی کند، از شما کمک بخواهند.
تابع getCooordinate() را پیادهسازی کنید که یک جفت (treasure, coordinate) را از فهرست Azara میگیرد و فقط مختصات نقشهی استخراجشده را برمیگرداند.
getCoordinate ("Scrimshaw Whale's Tooth", "2A")
// "2A"
تابع convertCoordinate() را پیادهسازی کنید که یک مختصات در قالب "2A" میگیرد و یک تاپل در قالب (2, 'A') برمیگرداند.
convertCoordinate "2A"
// (2, 'A')
تابع compareRecords() را پیادهسازی کنید که یک جفت (treasure, coordinate) و یک رکورد (location, coordinate, quadrant) میگیرد و مختصاتهای هر دو را با هم مقایسه میکند.
اگر مختصاتها «تطبیق» داشته باشند true را برگردانید و اگر نداشته باشند false را برگردانید.
برای مقایسهی دقیق، مختصاتها را در صورت نیاز دوباره قالببندی کنید.
compareRecords ("Brass Spyglass", "4B") ("Seaside Cottages", (1, 'C'), "blue")
// false
compareRecords ("Model Ship in Large Bottle", "8A") ("Harbor Managers Office", (8, 'A'), "purple")
// true
تابع createrecord() را پیادهسازی کنید که یک جفت (treasure, coordinate) را از فهرست Azara و یک رکورد (location, coordinate, quadrant) را از فهرست Rui میگیرد و اگر مختصاتها منطبق باشند (coordinate, location, quadrant, treasure) را برمیگرداند.
اگر مختصاتها منطبق نباشند، یک تاپل با همان شکل ولی پرشده با "" را برمیگرداند.
برای مقایسهی دقیق، مختصاتها را در صورت نیاز دوباره قالببندی کنید.
createRecord ("Brass Spyglass", "4B") ("Abandoned Lighthouse", (4, 'B'), "Blue")
// ("4B", "Abandoned Lighthouse", "Blue", "Brass Spyglass")
createRecord ("Brass Spyglass", "4B") ("Seaside Cottages", (1, 'C'), "Blue")
// ("", "", "", "")