F#-এ একটি array হলো শূন্য বা তার বেশি মানের একটি মিউটেবল কালেকশন, যার দৈর্ঘ্য নির্দিষ্ট। এর মানে হলো, একবার একটি অ্যারে তৈরি হয়ে গেলে তার আকার আর পরিবর্তন করা যায় না, কিন্তু তার মানগুলো পরিবর্তন করা যায়। একটি অ্যারেতে থাকা সব মানের টাইপ একই হতে হবে। অ্যারে নিচের মতো করে ডিফাইন করা যায়:
let empty = [| |]
let emptyAlternative = Array.empty
let singleValue = [| 5 |]
let singleValueAlternative = Array.singleton 5
let threeValues = [| "a"; "b"; "c" |]
এলিমেন্টগুলো একটি ইনডেক্স ব্যবহার করে অ্যারেতে অ্যাসাইন করা যায় বা অ্যারে থেকে পড়া যায়। F#-এর অ্যারে জিরো-বেজড, অর্থাৎ প্রথম এলিমেন্টের ইনডেক্স সবসময় শূন্য:
let numbers = [| 2; 3; 5 |]
// Update value in array
numbers[2] <- 9
// Read value from array
numbers[2]
// => 9
অ্যারে হয় Array মডিউলে ডিফাইন করা ফাংশন ও অপারেটর দিয়ে ম্যানিপুলেট করা হয়, অথবা অ্যারে প্যাটার্ন ব্যবহার করে প্যাটার্ন ম্যাচিংয়ের মাধ্যমে ম্যানুয়ালি করা হয়:
let describe array =
match array with
| [| |] -> "Empty"
| [| 1; 2; three |] -> sprintf "1, 2, %d" three
| _ -> "Other"
describe [| |] // => "Empty"
describe [| 1; 2; 4 |] // => "1, 2, 4"
describe [| 5; 7; 9 |] // => "Other"
প্যাটার্ন ম্যাচিংয়ের সময় আপনি একটি মান বাদ দিতেও পারেন; যখন কোনো নির্দিষ্ট কেসে কোনো মান নিয়ে আপনার কিছু যায় আসে না (অর্থাৎ মানটি আপনি ব্যবহার করবেন না), তখন এটি বোঝাতে একটি আন্ডারস্কোর ('_') ব্যবহার করতে পারেন:
let describe array =
match array with
| [| |] -> "Empty array"
| [| x |] -> "Array with one item"
| [| _; y |] -> "Array with two items (first item ignored)"
| _ -> "Array with many items (all items ignored)"
describe [| |] // => "Empty array"
describe [| 1 |] // => "Array with one item"
describe [| 5; 7 |] // => "Array with two items (first item ignored)"
describe [| 5; 7; 9 |] // => "Array with many items (all items ignored)"
প্যাটার্ন ম্যাচিংয়ের সময় একক '_' সর্বদা সবার শেষে আসা উচিত; অন্য কোনো কেসের সাথে মিলে না এমন প্রতিটি মান এই কেসটি দিয়ে হ্যান্ডেল করা হবে।
আপনি একজন উৎসাহী পাখি-পর্যবেক্ষক, যিনি গত সাত দিনে আপনার বাগানে কতটি পাখি এসেছে তার হিসাব রাখেন।
আপনার ছয়টি কাজ আছে, সবগুলোই আপনার বাগানে আসা পাখির সংখ্যা নিয়ে।
তুলনার সুবিধার জন্য আপনি সবসময় গত সপ্তাহের সংখ্যাগুলোর একটি কপি কাছে রাখেন, যেগুলো ছিল: 0, 2, 5, 3, 7, 8 এবং 4। গত সপ্তাহের সংখ্যাগুলো ধারণ করে এমন lastWeek বাইন্ডিংটি ডিফাইন করুন:
lastWeek
// => [| 0; 2; 5; 3; 7; 8; 4 |]
গতকাল আপনার বাগানে কতটি পাখি এসেছিল, তা রিটার্ন করার জন্য yesterday ফাংশনটি ইমপ্লিমেন্ট করুন। পাখির সংখ্যাগুলো দিন অনুসারে সাজানো, যেখানে প্রথম এলিমেন্টটি সবচেয়ে পুরোনো দিনের সংখ্যা আর শেষ এলিমেন্টটি আজকের সংখ্যা।
yesterday [| 3; 5; 0; 7; 4; 1 |]
// => 4
আপনার বাগানে যত পাখি এসেছে তার মোট সংখ্যা রিটার্ন করার জন্য total ফাংশনটি ইমপ্লিমেন্ট করুন:
total [| 3; 5; 0; 7; 4; 1 |]
// => 20
dayWithoutBirds ফাংশনটি ইমপ্লিমেন্ট করুন, যা true রিটার্ন করে যদি এমন কোনো দিন থাকে যেদিন বাগানে শূন্য পাখি এসেছিল; অন্যথায় false রিটার্ন করুন:
dayWithoutBirds [| 3; 5; 0; 7; 4; 1 |]
// => true
আজকের সংখ্যা এক বাড়িয়ে হালনাগাদ সংখ্যাগুলো রিটার্ন করার জন্য incrementTodaysCount ফাংশনটি ইমপ্লিমেন্ট করুন:
let birdCount = [| 3; 5; 0; 7; 4; 1 |]
incrementTodaysCount birdCount
// => [| 3; 5; 0; 7; 4; 2 |]
গত এক বছরে আপনি লক্ষ্য করেছেন, কিছু সপ্তাহে একই রকম অস্বাভাবিক প্যাটার্ন দেখা যায়:
unusualWeek ফাংশনটি ইমপ্লিমেন্ট করুন, যা true রিটার্ন করে যদি এই সপ্তাহের পাখি-সংখ্যার প্যাটার্নটি ওই অস্বাভাবিক প্যাটার্নগুলোর একটির সাথে মেলে:
unusualWeek [| 1; 0; 5; 0; 12; 0; 2 |]
// => true
unusualWeek [| 5; 0; 5; 12; 5; 3; 5|]
// => true
(লক্ষ্য করুন, দিনের জোড়-বিজোড় হিসাব 1-ইনডেক্সড, 0-ইনডেক্সড নয়। অ্যারের প্রথম এলিমেন্টটি একটি বিজোড় দিনের সাথে মেলে)
Exercism-এ সাইন আপ করুন, F# ট্র্যাকের 18টি কনসেপ্ট148টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।