Function Composition এবং Currying হল Functional Programming (FP) এর দুটি গুরুত্বপূর্ণ ধারণা যা LISP সহ অন্যান্য ফাংশনাল ভাষায় ব্যবহৃত হয়। এগুলি ফাংশনাল প্রোগ্রামিংয়ের শক্তিশালী কৌশল যা ফাংশনের মধ্যে কার্যকরী সম্পর্ক স্থাপন এবং কোডকে আরও মডুলার এবং পুনঃব্যবহারযোগ্য করে তোলে।
এখানে আমরা Function Composition এবং Currying এর ধারণা, ব্যবহার এবং তাদের পার্থক্য বিস্তারিতভাবে আলোচনা করব।
১. Function Composition (ফাংশন সংমিশ্রণ)
Function Composition হল একটি কৌশল যেখানে দুটি বা তার বেশি ফাংশনকে একত্রিত করা হয় যাতে একটি ফাংশনের আউটপুট আরেকটি ফাংশনের ইনপুট হিসেবে কাজ করে। এটি ফাংশনগুলির সমন্বয় সাধন করে এবং নতুন একটি ফাংশন তৈরি করা হয় যা একাধিক ফাংশনের আচরণ একত্রিত করে।
ব্যবহারের ধরন:
(compose f g)এখানে, compose ফাংশনটি প্রথমে g ফাংশনটি কল করবে এবং তারপর তার আউটপুটকে f ফাংশনে পাঠাবে। অর্থাৎ, যদি g ফাংশনটি x এর ওপর কাজ করে এবং f ফাংশনটি তার আউটপুটের ওপর কাজ করে, তবে (f (g x)) হবে।
উদাহরণ:
ধরা যাক, আমাদের দুটি ফাংশন আছে:
add1— এটি একটি সংখ্যার সাথে ১ যোগ করবে।square— এটি একটি সংখ্যার বর্গফল বের করবে।
(defun add1 (x)
(+ x 1))
(defun square (x)
(* x x))এখন, আমরা এই দুটি ফাংশনকে একত্রিত করতে পারি function composition এর মাধ্যমে।
(defun compose (f g)
(lambda (x) (funcall f (funcall g x))))
;; `add1` এবং `square` ফাংশনগুলি সংমিশ্রণ করা
(defvar f1 (compose #'add1 #'square))
(funcall f1 4) ; আউটপুট: 17এখানে:
squareফাংশনটি প্রথমে ৪ এর বর্গফল করবে, যা হবে ১৬।- তারপর
add1ফাংশনটি ১৬ এর সাথে ১ যোগ করবে, ফলে আউটপুট হবে ১৭।
২. Currying (কারিং)
Currying হল একটি ফাংশনাল প্রোগ্রামিং কৌশল যেখানে একটি ফাংশনকে একাধিক আর্গুমেন্টের পরিবর্তে এক একটি আর্গুমেন্ট গ্রহণ করার জন্য পরিবর্তিত করা হয়। এটি সাধারণত একটি ফাংশনকে পর্যায়ক্রমে আর্গুমেন্ট প্রদান করার মাধ্যমে কাজ করে। Currying মূলত একটি ফাংশনকে ছোট ছোট ফাংশনে ভেঙে দেয়, যেখানে প্রতিটি ফাংশন একটিই আর্গুমেন্ট গ্রহণ করে।
ব্যবহারের ধরন:
(defun curried-function (a)
(lambda (b) (+ a b)))এখানে, curried-function একটি নতুন ফাংশন তৈরি করবে যা প্রথম আর্গুমেন্ট a গ্রহণ করবে এবং তারপরে একটি ফাংশন প্রদান করবে যা দ্বিতীয় আর্গুমেন্ট b গ্রহণ করবে এবং তাদের যোগফল প্রদান করবে।
উদাহরণ:
ধরা যাক, আমাদের একটি ফাংশন আছে যা দুটি সংখ্যার যোগফল বের করবে। আমরা এই ফাংশনটিকে কারিং ব্যবহার করে ছোট ছোট ফাংশনে বিভক্ত করতে পারি।
(defun add (a)
(lambda (b) (+ a b)))
(defvar add5 (add 5)) ;; add5 ফাংশনটি এখন ৫ এর সাথে যোগ করবে
(funcall add5 3) ;; আউটপুট: 8এখানে:
addফাংশনটি প্রথমে একটি আর্গুমেন্টaনেবে এবং একটি নতুন ফাংশন তৈরি করবে যা দ্বিতীয় আর্গুমেন্টbনেবে।add5ফাংশনটি তৈরি হবে, যা প্রথমে ৫ এর সাথে অন্য যে কোনও মান যোগ করবে।add5 3এর আউটপুট হবে ৮।
Function Composition এবং Currying এর মধ্যে পার্থক্য
| কনসেপ্ট | Function Composition | Currying |
|---|---|---|
| ব্যবহার | একাধিক ফাংশনকে একত্রিত করে একটি নতুন ফাংশন তৈরি করা হয়। | একটি ফাংশনকে একাধিক ছোট ফাংশনে ভেঙে দেওয়া হয়, যেখানে প্রতিটি ফাংশন একটিই আর্গুমেন্ট নেয়। |
| ফলাফল | একটি ফাংশনকে অন্য একটি ফাংশনের আউটপুটে পরিবর্তিত করে। | প্রথম ফাংশনটির আর্গুমেন্ট দেওয়ার পর, নতুন একটি ফাংশন তৈরি হয়। |
| ফাংশনের আর্গুমেন্ট | একাধিক আর্গুমেন্ট গ্রহণ করে এবং ফাংশনগুলি একে অপরের আউটপুট ব্যবহার করে। | এক এক করে আর্গুমেন্ট নেয়, অর্থাৎ আর্গুমেন্টগুলি ধাপে ধাপে প্রদান করা হয়। |
সারসংক্ষেপ
- Function Composition হলো দুটি বা তার বেশি ফাংশনকে একত্রিত করে একটি নতুন ফাংশন তৈরি করার প্রক্রিয়া। এক ফাংশনের আউটপুট আরেকটি ফাংশনের ইনপুট হয়ে কাজ করে।
- Currying হলো একটি ফাংশনকে এমনভাবে রূপান্তর করা, যাতে এটি এক একটি আর্গুমেন্ট গ্রহণ করে এবং পর্যায়ক্রমে আরো আর্গুমেন্ট নিয়ে ফাংশনটির কাজ সম্পন্ন হয়।
এই দুটি কৌশলই ফাংশনাল প্রোগ্রামিংয়ের অত্যন্ত শক্তিশালী টুল যা কোডকে আরও মডুলার, পুনঃব্যবহারযোগ্য এবং কার্যকরী করে তোলে।
Read more