একটি টিউপল হলো নামহীন কিন্তু ক্রম অনুসারে সাজানো মানের একটি ইমিউটেবল সমষ্টি। টিউপলে যেকোনো (বা একাধিক) ডেটা টাইপ রাখা যায়, এমনকি অন্য টিউপলও।
টিউপলকে ( ও ) অক্ষরের মাঝে কমা দিয়ে আলাদা করা মান হিসেবে লেখা হয়: (<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
আজারা আর রুই একই দলের সতীর্থ, তারা জলদস্যু-থিমের একটি ট্রেজার হান্ট প্রতিযোগিতায় লড়ছে। একজনের কাছে ম্যাপের কোঅর্ডিনেটসহ ট্রেজারদের একটি তালিকা আছে, অন্যজনের কাছে ম্যাপের কোঅর্ডিনেটসহ লোকেশনের নামের একটি তালিকা। তাদের দুজনকে ফাঁকা ম্যাপও দেওয়া হয়েছে, যেখানে শুরুর স্থানে লেখা আছে YOU ARE HERE।
| আজারার তালিকা | রুইয়ের তালিকা | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
তবে ব্যাপারটা একটু এলোমেলো: আজারার কোঅর্ডিনেটগুলো দেখে মনে হয় রুইয়ের থেকে আলাদাভাবে ফরম্যাট করা আর সাজানো হয়েছে, আর কোন ট্রেজার কোন লোকেশনের সাথে যায় সেটা বের করার জন্য তাদের বারবার এক তালিকা থেকে আরেক তালিকায় দেখতে হচ্ছে। যেহেতু তারা সদ্য F# শিখতে শুরু করেছে, তাই হান্টের তথ্যগুলো আরও ভালোভাবে গুছিয়ে রাখার জন্য একটি ছোট প্রোগ্রাম (আসলে কিছু ফাংশন) লিখতে তারা আপনার কাছে সাহায্য চেয়ে এসেছে।
getCooordinate() ফাংশনটি ইমপ্লিমেন্ট করুন, যা আজারার তালিকা থেকে একটি (treasure, coordinate) জোড়া নেয় এবং শুধু বের করা ম্যাপ কোঅর্ডিনেটটি রিটার্ন করে।
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) জোড়া এবং রুইয়ের তালিকা থেকে একটি (location, coordinate, quadrant) রেকর্ড নেয়, আর কোঅর্ডিনেটগুলো মিলে গেলে (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")
// ("", "", "", "")
Exercism-এ সাইন আপ করুন, F# ট্র্যাকের 18টি কনসেপ্ট148টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।