কম্পিউটার বিজ্ঞানের ভিত্তি/উচ্চতর ফাংশন

উচ্চতর ক্রিয়াকলাপ (Higher Order Functions)

সম্পাদনা

উচ্চতর ক্রিয়াকলাপ সমাধানকে আরও শক্তিশালীভাবে সাধারণীকরণ করার একটি উপায় প্রদান করে, যা ব্লকগুলোকে প্যারামিটার হিসেবে গ্রহণ করে এবং একটি ব্লককে রিটার্ন ভ্যালু হিসেবে ফেরত দেয়। অন্য সব ক্রিয়াকলাপ প্রথম স্তরের ক্রিয়াকলাপ (First Order Functions) নামে পরিচিত। গাণিতিক ক্ষেত্রে একটি উচ্চতর ক্রিয়াকলাপের উদাহরণ হল ডেরিভেটিভ ফাংশন, যা একটি ফাংশনকে ইনপুট হিসেবে গ্রহণ করে এবং আরেকটি ফাংশন (প্রথম ফাংশনের ডেরিভেটিভ) আউটপুট হিসেবে উৎপন্ন করে। কম্পিউটার বিজ্ঞানে, একটি ম্যাপ ফাংশন একটি ইচ্ছামত ফাংশন এবং একটি ডেটাসেট (যেমন একটি তালিকা) গ্রহণ করে এবং সেটের প্রতিটি ডেটা আইটেমে ফাংশনটি প্রয়োগ করে। আরেকটি উদাহরণ হল রিডিউস (অথবা ফোল্ড) ফাংশন, যা একটি ইনপুট ফাংশন এবং ডেটাসেট গ্রহণ করে এবং ফাংশনের মাধ্যমে ডেটাসেটের সমস্ত আইটেমের সংকলন উৎপন্ন করে। উদাহরণস্বরূপ, যদি ইনপুট ফাংশনটি সংযোজন হয় তবে রিডিউস ফাংশন ডেটাসেটের সমস্ত আইটেমের সমষ্টি আউটপুট হিসেবে প্রদান করে। যদি ইনপুট ফাংশনটি গুণন হয় তবে রিডিউস ফাংশন ডেটাসেটের সমস্ত আইটেমের গুণফল উৎপন্ন করে। উচ্চতর ক্রিয়াকলাপ আমাদের বিদ্যমান ফাংশনগুলি ব্যবহার করে চলমান অবস্থায় ফাংশনের সংমিশ্রণ তৈরি করতে দেয়। উদাহরণস্বরূপ, দুটি ফাংশন   এবং   এবং   এবং   আমরা একটি ফাংশন তৈরি করতে পারি   যাতে  .

উদাহরণ

সম্পাদনা

নিচের স্ক্রিপ্টটি একটি তালিকার প্রতিটি উপাদানের উপর একই ব্লক/ক্রিয়াকলাপ প্রয়োগ করতে বিল্ট ইন ম্যাপ ব্লক/ক্রিয়াকলাপ ব্যবহার করে।

 

একটি ভিন্ন ক্রিয়াকলাপ প্রয়োগ করতে হলে আমাদের কেবলমাত্র সেই ক্রিয়াকলাপটি খুঁজে বের করতে বা বাস্তবায়ন করতে হবে এবং ম্যাপ ব্লকের প্রথম প্যারামিটার হিসেবে ব্যবহার করতে হবে। পরবর্তী উদাহরণটি গুণন ক্রিয়াকলাপ ব্যবহার করে যা দুটি প্যারামিটার নেয়। স্ন্যাপ! যথেষ্ট স্মার্ট যে এটি বুঝতে পারে এবং যখন ক্রিয়াকলাপটি প্রয়োগ করা হয়, তালিকার প্রতিটি উপাদান উভয় প্যারামিটার হিসেবে ব্যবহার করে। তাই ফলাফল তালিকায় থাকা উপাদানগুলো মূল তালিকার উপাদানগুলোর সাথে তাদের নিজেদের গুণফল হবে।

 

এই ম্যাপ ব্লকটি একই ক্রিয়াকলাপ একাধিক ডেটা আইটেমের উপর প্রয়োগ করার এই প্যাটার্নকে একটি ব্লকে সাধারণীকরণ করেছে। এটি প্রোগ্রামিংকে সহজ করে না কারণ কেউ একজনকে এই ম্যাপ ব্লকটি লিখতে হয় (কোডের উৎস দেখুন কিভাবে জটিল এটি দেখতে), কিন্তু এটি প্রোগ্রামারদের আরও সুখী করে তোলে কারণ এটি চিন্তার অংশটি সহজ করে তোলে। প্রোগ্রামার হিসেবে আমরা তালিকার পুনরাবৃত্তি সম্পর্কে চিন্তা করা থেকে মুক্তি পাই যাতে আমরা তালিকার উপর প্রয়োগ করতে প্রয়োজনীয় ক্রিয়াকলাপের উপর ফোকাস করতে পারি।

রিডিউস

সম্পাদনা

নিচের দুটি উদাহরণ স্ন্যাপ! এ বিল্ট-ইন রিডিউস ফাংশন ব্যবহার করে একটি সংখ্যার তালিকার সমষ্টি এবং গুণফল হিসাব করে।

 

 


লক্ষ্য করুন যে রিডিউস (মিলিয়ে নাও) ফাংশন যেকোন দুটি ইনপুট প্যারামিটারের ফাংশন গ্রহণ করে একটি তালিকার মানকে একটি একক মানে সংকলিত করতে পারে। উচ্চতর ক্রিয়াকলাপ ব্যবহার করে আমরা সাধারণীকৃত সমাধান তৈরি করতে পারি যা বৃহত্তর সমস্যার সেট সমাধানের জন্য কাস্টমাইজ করা যায়।

ডেটা হিসেবে ব্লক ফেরত দেওয়া

সম্পাদনা

নিম্নলিখিত ব্লকটি ডেটা হিসেবে ব্লকের ব্যবহার প্রদর্শন করে। এই ব্লকে দুটি রিপোর্টার ব্লক প্যারামিটার হিসেবে নেওয়া হয়, যা পরে রিপোর্ট ভ্যালু - একটি নতুন ব্লক তৈরি করতে ব্যবহৃত হয়। নতুন ব্লকটি কিছু অজানা ইনপুট মানের উপর দুটি ইনপুট রিপোর্ট ব্লক প্রয়োগ করে। লক্ষ্য করুন যে রিপোর্ট ভ্যালুর চারপাশে থাকা "রিং" (ধূসর ফ্রেম) খুবই গুরুত্বপূর্ণ। "রিং"-এর মধ্যে যা কিছু অন্তর্ভুক্ত করা হয় তা প্রোগ্রাম হিসেবে নয়, ডেটা হিসেবে গণ্য হবে। দুটি ফাংশনের প্রয়োগ মূল্যায়ন করা হবে না বরং কেবল ডেটা হিসেবে ফেরত দেওয়া হবে, যা আমরা এই উচ্চতর ক্রিয়াকলাপে চেয়েছিলাম।

 

সংযুক্ত ফাংশন ব্যবহার করতে আমরা দুটি ইনপুট ফাংশন দিয়ে কম্পোজ ফাংশনটি কল করতে পারি এবং নিম্নলিখিত স্ক্রিপ্টে দেখানো ইনপুট মানের বিপরীতে সংযুক্ত ব্লকটি কার্যকর করতে "কল" ব্লকটি ব্যবহার করতে পারি।

 


এই "কম্পোজ" ব্লকটির সাথে আমরা প্রয়োজনের সময় বিদ্যমান ফাংশনগুলি সংমিশ্রণ করে নতুন ফাংশনগুলি সংজ্ঞায়িত করি। এটি সাধারণীকরণের একটি শক্তিশালী উপায় যা আমরা উচ্চতর ক্রিয়াকলাপ ব্যবহার না করে অর্জন করতে পারি না।