Haskell এ First-Class Functions এবং Higher-Order Functions এর ধারণা
Haskell একটি ফাংশনাল প্রোগ্রামিং ভাষা, যেখানে First-Class Functions এবং Higher-Order Functions খুবই গুরুত্বপূর্ণ ধারণা। এই ধারণাগুলি ফাংশনাল প্রোগ্রামিং প্যারাডাইমের মূল অংশ এবং প্রোগ্রামিংয়ের শক্তিশালী সরঞ্জাম সরবরাহ করে।
1. First-Class Functions
First-Class Functions এর মানে হল যে ফাংশনকে অন্য যে কোনো ভ্যালুর মতো ব্যবহার করা যায়। এর অর্থ হলো:
- ফাংশনকে ভেরিয়েবল হিসেবে অ্যাসাইন করা যায়।
- ফাংশনকে আর্গুমেন্ট হিসেবে পাস করা যায়।
- ফাংশনকে ফলস্বরূপ (return) প্রদান করা যায়।
Haskell এ ফাংশনগুলি first-class citizens হয়, যা মানে ফাংশনগুলি অন্যান্য ডেটা টাইপের মতো ব্যবহৃত হতে পারে।
উদাহরণ:
-- একটি ফাংশন যা অন্য একটি ফাংশন গ্রহণ করে এবং তাকে কল করে
applyFunction :: (Int -> Int) -> Int -> Int
applyFunction f x = f x
-- একটি ফাংশন যা একটি সংখ্যা দ্বিগুণ করে
double :: Int -> Int
double x = x * 2
-- ফাংশন প্রয়োগ
main :: IO ()
main = do
print (applyFunction double 5) -- আউটপুট: 10এখানে, applyFunction একটি ফাংশন যা অন্য একটি ফাংশন গ্রহণ করে এবং তা প্রয়োগ করে। double ফাংশনকে applyFunction এর মাধ্যমে পাস করা হয়েছে এবং আউটপুট হিসেবে ৫ এর দ্বিগুণ প্রদান করা হয়েছে।
2. Higher-Order Functions
Higher-Order Functions (HOF) হল এমন ফাংশন যা ফাংশনকে আর্গুমেন্ট হিসেবে গ্রহণ করতে পারে অথবা ফাংশনকে ফলস্বরূপ (return) প্রদান করতে পারে।
HOF প্রোগ্রামিংয়ের আরও শক্তিশালী ধারণা, যেটি কোড পুনঃব্যবহারযোগ্যতা এবং জেনেরিক কোড তৈরিতে সহায়ক। Haskell এ ফাংশনগুলি উচ্চতর আদলে তৈরি করা খুবই সাধারণ।
উদাহরণ ১: একটি Higher-Order Function
-- একটি ফাংশন যা দুটি ফাংশনকে আর্গুমেন্ট হিসেবে গ্রহণ করে
compose :: (b -> c) -> (a -> b) -> a -> c
compose f g = \x -> f (g x)
-- দুটি ফাংশন
addOne :: Int -> Int
addOne x = x + 1
double :: Int -> Int
double x = x * 2
-- compose ফাংশনের মাধ্যমে দুটি ফাংশন একত্রিত করা
main :: IO ()
main = do
print (compose addOne double 3) -- আউটপুট: 7 (3 -> 2 -> 3 -> 7)এখানে, compose একটি Higher-Order Function যা দুটি ফাংশন f এবং g গ্রহণ করে এবং তাদের একত্রিত করে একটি নতুন ফাংশন তৈরি করে। addOne এবং double ফাংশনগুলিকে একত্রিত করে একটি নতুন ফাংশন তৈরি করা হয়েছে।
উদাহরণ ২: Higher-Order Function ফলস্বরূপ প্রদান
-- একটি ফাংশন যা একটি ফাংশনকে ফলস্বরূপ প্রদান করে
makeAdder :: Int -> (Int -> Int)
makeAdder x = \y -> x + y
-- নতুন ফাংশন তৈরি
main :: IO ()
main = do
let add5 = makeAdder 5
print (add5 10) -- আউটপুট: 15এখানে, makeAdder একটি Higher-Order Function যা একটি Int গ্রহণ করে এবং একটি ফাংশন প্রদান করে যা একটি সংখ্যার সাথে যোগফল করবে। add5 ফাংশন তৈরি হয়েছে যা কোনো সংখ্যার সাথে ৫ যোগ করবে।
Higher-Order Functions এর ব্যবহার
Higher-Order Functions কোডের পুনঃব্যবহারযোগ্যতা এবং কার্যকারিতা বাড়ানোর জন্য অত্যন্ত উপকারী। কিছু সাধারণ Higher-Order Functions এর উদাহরণ:
1. map: map একটি HOF যা একটি ফাংশন গ্রহণ করে এবং একটি লিস্টের প্রতিটি উপাদানে সেই ফাংশন প্রয়োগ করে।
-- `map` উদাহরণ
main :: IO ()
main = do
print (map (*2) [1, 2, 3, 4]) -- আউটপুট: [2, 4, 6, 8]এখানে, map (*2) একটি ফাংশন গ্রহণ করে এবং তা [1, 2, 3, 4] লিস্টের প্রতিটি উপাদানে প্রয়োগ করে।
2. filter: filter একটি HOF যা একটি শর্ত (predicate) ফাংশন গ্রহণ করে এবং একটি লিস্টের যেসব উপাদান শর্ত পূরণ করে, সেগুলি রিটার্ন করে।
-- `filter` উদাহরণ
main :: IO ()
main = do
print (filter even [1, 2, 3, 4]) -- আউটপুট: [2, 4]এখানে, filter even ফাংশনটি লিস্টের এমন উপাদানগুলো নির্বাচন করে যা even (জোড় সংখ্যা)।
3. foldr: foldr একটি Higher-Order Function যা একটি ফাংশন এবং একটি অ্যাকিউমুলেটর মান (initial value) নিয়ে একটি লিস্টের সব উপাদান একত্রিত করে।
-- `foldr` উদাহরণ
main :: IO ()
main = do
print (foldr (+) 0 [1, 2, 3, 4]) -- আউটপুট: 10এখানে, foldr (+) 0 সব উপাদানের উপর যোগফল করে, এবং 0 হলো প্রাথমিক মান।
উপসংহার
Haskell এ First-Class Functions এবং Higher-Order Functions ফাংশনাল প্রোগ্রামিংয়ের মূল ধারণা। First-Class Functions হল ফাংশনগুলোকে ডেটা হিসেবে ব্যবহার করার ক্ষমতা, এবং Higher-Order Functions হল ফাংশন যেগুলি অন্য ফাংশনকে আর্গুমেন্ট হিসেবে নেয় বা ফলস্বরূপ প্রদান করে। এই ধারণাগুলির মাধ্যমে Haskell এ প্রোগ্রামিং আরও মডুলার, পুনঃব্যবহারযোগ্য এবং কার্যকরী হয়, যা কোডের পরিস্কারতা এবং সঠিকতা বাড়ায়।
Read more