F#-এ একটি list হলো শূন্য বা ততোধিক মানের একটি ইমিউটেবল কালেকশন। একটি অ্যারের সব মানের টাইপ একই হতে হবে। যেহেতু অ্যারে ইমিউটেবল, একবার একটি অ্যারে তৈরি হয়ে গেলে তার মান আর কখনো বদলানো যায় না। যে ফাংশন/অপারেটরগুলো একটি অ্যারে পরিবর্তন করে বলে মনে হয় (যেমন একটি এলিমেন্ট যোগ করা), তারা আসলে একটি নতুন অ্যারে রিটার্ন করে।
অ্যারে এভাবে ডিফাইন করা যায়:
let empty = []
let singleValue = [5]
let threeValues = ["a"; "b"; "c"]
একটি অ্যারেতে এলিমেন্ট যোগ করার সবচেয়ে কমন উপায় হলো :: (কনস) অপারেটরের মাধ্যমে:
let twoToFour = [2; 3; 4]
let oneToFour = 1 :: twoToFour
// => [1; 2; 3; 4]
একটি F# অ্যারের একটি হেড (প্রথম এলিমেন্ট) এবং একটি টেইল (প্রথম এলিমেন্টের পরের সবকিছু) থাকে। একটি অ্যারের টেইল নিজেই একটি অ্যারে।
অ্যারে হয় List মডিউলে ডিফাইন করা ফাংশন ও অপারেটর দিয়ে, অথবা ম্যানুয়ালি list এবং cons প্যাটার্ন দিয়ে প্যাটার্ন ম্যাচিং করে ম্যানিপুলেট করা হয়:
let describe list =
match list with
| [] -> "Empty list"
| head::tail -> sprintf "Non-empty list with head: %d" head
describe [] // => "Empty list"
describe [1] // => "Non-empty with head: 1"
describe [5; 7; 9] // => "Non-empty with head: 5"
প্যাটার্ন ম্যাচিংয়ের সময় আপনি একটি মান ডিসকার্ড করতে পারেন; যখন কোনো নির্দিষ্ট কেসে একটি মানের প্রতি আপনার আগ্রহ নেই (অর্থাৎ আপনি মানটি ব্যবহার করবেন না), তখন এটি বোঝাতে আপনি একটি আন্ডারস্কোর ('_') ব্যবহার করতে পারেন:
let describe list =
match list with
| [] -> "Empty list"
| [x] -> "List with one item"
| [_; y] -> "List with two items (first item ignored)"
| _ -> "List with many items (all items ignored)"
describe [] // => "Empty list"
describe [1] // => "List with one item"
describe [5; 7] // => "List with two items (first item ignored)"
describe [5; 7; 9] // => "List with many items (all items ignored)"
একক '_' প্যাটার্ন ম্যাচিংয়ে সবসময় সবার শেষে আসা উচিত; যে কোনো মান অন্য কোনো কেসের সাথে মেলে না, সেটি এই কেস দ্বারা হ্যান্ডেল করা হবে।
এই অনুশীলনীতে আপনি Exercism-এ শিখতে চান এমন প্রোগ্রামিং ভাষার একটি অ্যারে নিয়ে হিসাব রাখার কোড লিখবেন।
আপনার ছয়টি কাজ আছে, যার প্রতিটিতেই অ্যারে নিয়ে কাজ করতে হবে।
আপনি যে ভাষাগুলো শিখতে চান সেগুলোর হিসাব রাখতে হলে আপনাকে একটি নতুন অ্যারে তৈরি করতে হবে। একটি নতুন, খালি অ্যারে ধারণ করে এমন newList বাইন্ডিংটি ডিফাইন করুন।
newList
// => []
বর্তমানে আপনার কাছে একটি কাগজের টুকরো আছে, যেখানে আপনি যে ভাষাগুলো শিখতে চান সেগুলো লেখা আছে: F#, Clojure এবং Haskell। এই অ্যারেটি বোঝাতে existingList বাইন্ডিংটি ডিফাইন করুন।
existingList
// => ["F#"; "Clojure"; "Haskell"]
Exercism ঘুরে দেখতে দেখতে যখন আরও মজার ভাষা খুঁজে পান, তখন সেগুলো আপনার অ্যারেতে যোগ করতে চান। আপনার অ্যারের শুরুতে একটি নতুন ভাষা যোগ করতে addLanguage ফাংশনটি ইমপ্লিমেন্ট করুন।
addLanguage "TypeScript" ["JavaScript"; "CoffeeScript"]
// => ["TypeScript"; "JavaScript"; "CoffeeScript"]
একটি একটি করে ভাষা গণনা করা অসুবিধাজনক। আপনার অ্যারেতে ভাষার সংখ্যা গণনা করতে countLanguages ফাংশনটি ইমপ্লিমেন্ট করুন।
countLanguages ["C#"; "Racket"; "Rust"; "Ruby"]
// => 4
একসময় আপনি বুঝতে পারবেন যে আপনার অ্যারেটি আসলে উল্টো ক্রমে সাজানো! আপনার অ্যারেটি উল্টে দিতে reverseList ফাংশনটি ইমপ্লিমেন্ট করুন।
reverseList ["Prolog"; "C"; "Idris"; "Assembly"]
// => ["Assembly"; "Idris"; "C"; "Prolog"]
আপনি সব ভাষাই ভালোবাসেন, তবে F#-এর জন্য আপনার হৃদয়ে বিশেষ একটি জায়গা আছে। তাই নিচের শর্তগুলো পূরণ হলে একটি ভাষার অ্যারে আপনার কাছে সত্যিই রোমাঞ্চকর:
একটি ভাষার অ্যারে রোমাঞ্চকর কি না তা যাচাই করতে excitingList ফাংশনটি ইমপ্লিমেন্ট করুন:
excitingList ["Nim"; "F#"]
// => true
Exercism-এ সাইন আপ করুন, F# ট্র্যাকের 18টি কনসেপ্ট148টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।