টি এল; ডিআর;
দীর্ঘ সংস্করণ
আমি এই বিষয়টিতে কিছুটা ব্যাখ্যা করতে চাই কারণ এটি আমার কাছে খুব আকর্ষণীয় মনে হয়েছে। দাবি অস্বীকার: আমি লম্বা ক্যালকুলাসে আমার কোর্সটি অনেক আগে নিয়েছি। যদি আরও ভাল জ্ঞানের অধিকারী কেউ আমার উত্তরে কোনও ত্রুটি খুঁজে পায় তবে এটিকে উন্নত করতে আমাকে নির্দ্বিধায় সাহায্য করুন।
আসুন এক্সপ্রেশন দিয়ে শুরু করা যাক, 1 + 2
এবং x + 2
। যেমন লিটারেল 1
এবং 2
বলা হয় ধ্রুবক কারণ তারা নির্দিষ্ট নির্দিষ্ট মান আবদ্ধ হয়।
যেমন একটি সনাক্তকারীকে পরিবর্তনশীলx
বলা হয় এবং এটি মূল্যায়নের জন্য আপনাকে প্রথমে এটি কোনও মানকে আবদ্ধ করতে হবে। সুতরাং, মূলত আপনি x + 1
যতক্ষণ জানেন না ততক্ষণ মূল্যায়ন করতে পারবেন না x
।
ল্যাম্বডে নোটেশনটি ভেরিয়েবলগুলিতে নির্দিষ্ট ইনপুট মানগুলিকে আবদ্ধ করার জন্য একটি স্কিমা সরবরাহ করে। একটি ল্যাম্বডা এক্সপ্রেশনλx .
একটি বিদ্যমান এক্সপ্রেশন এর সামনে যোগ করে গঠিত হতে পারে , যেমন λx . x + 1
। চলক x
মনে করা হয় বিনামূল্যে মধ্যে x + 1
এবং আবদ্ধ মধ্যেλx . x + 1
কীভাবে এটি এক্সপ্রেশন মূল্যায়নে সহায়তা করে? আপনি যদি ল্যাম্বডা এক্সপ্রেশনকে কোনও মান খাওয়ান, ঠিক তেমন
(λx . x + 1) 2
তারপরে আপনি ভেরিয়েবলের সমস্ত উপস্থিতি x
2 মান দিয়ে প্রতিস্থাপন (বাঁধাই) দ্বারা সম্পূর্ণ অভিব্যক্তিটি মূল্যায়ন করতে পারেন :
(λx . x + 1) 2
2 + 1
3
সুতরাং, ল্যাম্বডে নোটেশনটি ভেরিয়েবলের সাথে জিনিসগুলি আবদ্ধ করার জন্য একটি সাধারণ প্রক্রিয়া সরবরাহ করে যা একটি এক্সপ্রেশন / প্রোগ্রাম ব্লকে প্রদর্শিত হয়। প্রসঙ্গের উপর নির্ভর করে, এটি প্রোগ্রামিং ভাষাগুলিতে দৃশ্যত বিভিন্ন ধারণা তৈরি করে:
- হাস্কেলের মতো বিশুদ্ধভাবে কার্যকরী ভাষায় ল্যাম্বডা এক্সপ্রেশনগুলি গাণিতিক অর্থে ফাংশনগুলি উপস্থাপন করে : একটি ইনপুট মান ল্যাম্বার দেহে প্রবেশ করা হয় এবং একটি আউটপুট মান উত্পন্ন হয়।
- অনেক ভাষায় (যেমন জাভাস্ক্রিপ্ট, পাইথন, স্কিম) ল্যাম্বডা এক্সপ্রেশনটির বডিটি মূল্যায়ন করলে পার্শ্ব-প্রতিক্রিয়া হতে পারে। এক্ষেত্রে পার্থক্যটি বিশুদ্ধ কার্যকারিতা চিহ্নিত করতে একটি শব্দ পদ্ধতি ব্যবহার করতে পারে ।
পার্থক্যগুলি ছাড়াও ল্যাম্বডে স্বরলিপিটি আনুষ্ঠানিক পরামিতিগুলি সংজ্ঞায়িত করতে এবং তাদেরকে প্রকৃত পরামিতিগুলিতে আবদ্ধ করার বিষয়ে।
পরবর্তী পদক্ষেপটি হ'ল একটি ফাংশন / পদ্ধতিটিকে একটি নাম দেওয়া। বেশ কয়েকটি ভাষায়, ফাংশনগুলি হ'ল অন্যগুলির মতো মান, সুতরাং আপনি কোনও ফাংশনটিকে নীচে নাম দিতে পারেন:
(define f (lambda (x) (+ x 1))) ;; Scheme
f = \x -> x + 1 -- Haskell
val f: (Int => Int) = x => x + 1 // Scala
var f = function(x) { return x + 1 } // JavaScript
f = lambda x: x + 1 # Python
এলি বারজিলে যেমন উল্লেখ করেছেন, এই সংজ্ঞাটি নামটিকে f
কেবল একটি মানকে আবদ্ধ করে , যা একটি ফাংশন হিসাবে ঘটে। সুতরাং এই ক্ষেত্রে, ফাংশন, সংখ্যা, স্ট্রিং, অক্ষর সমস্ত মান যা একইভাবে নামের সাথে আবদ্ধ হতে পারে:
(define n 42) ;; Scheme
n = 42 -- Haskell
val n: Int = 42 // Scala
var n = 42 // JavaScript
n = 42 # Python
এই ভাষাগুলিতে আপনি আরও পরিচিত (তবে সমমানের) স্বরলিপি ব্যবহার করে কোনও নামের সাথে একটি ফাংশন বাঁধতে পারেন:
(define (f x) (+ x 1)) ;; Scheme
f x = x + 1 -- Haskell
def f(x: Int): Int = x + 1 // Scala
function f(x) { return x + 1 } // JavaScript
def f(x): return x + 1 # Python
কিছু ভাষা যেমন সি, কেবলমাত্র (নামকরণ) ফাংশন সংজ্ঞায়নের জন্য পরবর্তী চিহ্নকে সমর্থন করে।
বন্ধ
বন্ধ সম্পর্কে কিছু চূড়ান্ত পর্যবেক্ষণ । অভিব্যক্তি বিবেচনা করুন x + y
। এটিতে দুটি বিনামূল্যে ভেরিয়েবল রয়েছে। x
ল্যাম্বডা স্বরলিপি ব্যবহার করে আপনি যদি আবদ্ধ হন তবে পাবেন:
\x -> x + y
এটি (এখনও) কোনও ফাংশন নয় কারণ এতে এখনও একটি ফ্রি ভেরিয়েবল রয়েছে y
। আপনি এটির y
সাথেও বাইন্ডিং করে একটি ফাংশন তৈরি করতে পারেন :
\x -> \y -> x + y
অথবা
\x y -> x + y
যা +
ফাংশন হিসাবে ঠিক একই ।
তবে আপনি বাঁধতে পারেন, বলুন, y
অন্যভাবে (*):
incrementBy y = \x -> x + y
কোনও সংখ্যায় ফাংশন ইনক্রিমেন্ট বাই প্রয়োগের ফলাফল হ'ল একটি ক্লোজার, অর্থাত্ একটি ফাংশন / প্রক্রিয়া যার শরীরে একটি ফ্রি ভেরিয়েবল (উদাহরণস্বরূপ y
) থাকে যা পরিবেশটি থেকে ক্লোর সংজ্ঞাটি সংজ্ঞায়িত করা হয়েছিল a
সুতরাং incrementBy 5
ফাংশন (বন্ধ) যে সংখ্যা দ্বারা 5 বৃদ্ধি করে।
বিঃদ্রঃ (*)
আমি এখানে কিছুটা প্রতারণা করছি:
incrementBy y = \x -> x + y
সমতুল্য
incrementBy = \y -> \x -> x + y
সুতরাং বাধ্যবাধকতা একই। স্বজ্ঞাতভাবে, আমি আরও জটিল ল্যাম্বডা অভিব্যক্তির একটি অংশকে উপস্থাপন হিসাবে বন্ধের কথা ভাবি। যখন এই উপস্থাপনাটি তৈরি করা হয়, তখন মাতৃগর্ভরতার কিছু বাঁধাই ইতিমধ্যে সেট হয়ে গেছে এবং মূল্যায়ন / অনুরোধ করা হলে বন্ধটি পরে তাদের ব্যবহার করে।