একটি ফাংশন এবং একটি lambda মধ্যে পার্থক্য কি?


54

আমি 'ফাংশন' এবং 'ল্যাম্বদা' সম্পর্কে কিছুটা বিভ্রান্ত। আমি কিছু উদাহরণ দেখিয়েছি যে স্কিম কীওয়ার্ডটি lambdaজাভাস্ক্রিপ্ট কীওয়ার্ডের সাথে খুব একইভাবে কাজ করে function, তবে কীভাবে তারা সম্পর্কিত তা আমি সত্যিই জানি না।

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

আমি 'ল্যাম্বদা ক্যালকুলাস' শব্দটির সাথেও অস্পষ্টভাবে পরিচিত।

একটি ফাংশন এবং একটি lambda মধ্যে পার্থক্য কি?


3
নিতপিক - এগুলিকে "ল্যাম্বডা এক্সপ্রেশন" বলা হয়, "ল্যাম্বডা ফাংশন" নয়, কমপক্ষে সি # /। নেট ডকুমেন্টেশন পর্যন্ত।
ওদে

@ TWith2Sugars - বার্তাটি পড়ুন। আপনার উত্তরটি নিম্নমানের কারণ এটি কেবলমাত্র একটি লিঙ্ক, সুতরাং একটি মন্তব্যে রূপান্তরিত হয়েছে।
ওডে

17
I wonder if 'lambda' has some esoteric meaning, seeing that the Greek letter lambda (λ) appears in so many avatars on this site.কেউ আশা করবে এটি ল্যাম্বডা ক্যালকুলাসের প্রসঙ্গে হবে, তবে আমার একটি আশ্চর্য অনুভূতি আছে যে হাফ লাইফ ল্যাম্বডা অবতারের জন্য দোষী।
ইয়ানিস

3
: যথেষ্ট ফেয়ার এখানে Stackoverflow উত্তর লিংক stackoverflow.com/questions/16501/what-is-a-lambda-function
TWith2Sugars

@ জাফডবিবলব্রক্স: আমার সন্দেহ হয় আপনি হাফ-লাইফ প্রভাব সম্পর্কে সঠিক। : /
হতাশ

উত্তর:


44

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

স্কিমের ল্যাম্বদা কীওয়ার্ড এবং জাভাস্ক্রিপ্টের ফাংশন কীওয়ার্ডের মধ্যে পার্থক্যটি হ'ল পরেরটি বেনামে ফাংশন এবং নামকরণ উভয় ফাংশন তৈরি করতে ব্যবহার করা যেতে পারে তবে প্রাক্তন কেবল বেনাম ফাংশন তৈরি করেন (এবং আপনি defineনামযুক্ত ফাংশন তৈরি করতে ব্যবহার করবেন)।

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


1
এটি অত্যন্ত রুক্ষ। নামগুলি তৈরি করতে আপনি define(বা letতার কোনও আত্মীয়, বা একটি অভ্যন্তরীণ সংজ্ঞা) ব্যবহার করেন - এগুলিই। defineফাংশন সম্পর্কিত ক্ষেত্রে বিশেষ কিছুই নেই ।
এলি বারজিলে

2
@EliBarzilay ওয়েল, define না ফাংশন সংজ্ঞায়িত (অর্থাত আপনি লিখতে পারেন জন্য একটি বিশেষ ফর্ম আছে (define (f x) (foo))পরিবর্তে (define f (lambda (x) (foo)))), কিন্তু আমার পয়েন্ট ছিল আপনার ব্যবহার করা একটি নামাঙ্কিত ফাংশন তৈরি করতে পারবেন না lambda, একা অর্থাৎ আপনি কিছু লিখতে পারি না পছন্দ (lambda f (x) (foo))নামে একটি ফাংশন সংজ্ঞায়িত করতে fজাভাস্ক্রিপ্টের functionকীওয়ার্ডের সাহায্যে আপনার পক্ষে এটির মতো একটি যুক্তি লাগে ।
sepp2k

1
defineসিনট্যাকটিক চিনি হিসাবে এটি রয়েছে, সুতরাং এটি সমস্ত মানের জন্য নাম বাঁধার সরঞ্জাম হিসাবে এর ভূমিকাটির মতো গুরুত্বপূর্ণ নয়। lambdaনিজে নিজেই নাম না তৈরি করার জন্য : এটি একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যেহেতু এটি ফাংশন ফর্ম থেকে নাম দেওয়া পৃথক করে ... আইএমও জেএস বিচ্ছিন্নতার অনুমতি দেওয়ার ক্ষেত্রে যথাযথ কাজ করছে এবং সেইসাথে জনসাধারণের জন্য একটি optionচ্ছিক নাম গ্রহণ করলেও যারা আতঙ্কিত হবে কোন নাম ছাড়া একটি ফাংশন ধারণা। (এবং ভাগ্যক্রমে এই জনগণের আকার একটি সাধারণ অবক্ষয়ের মধ্যে ...)
এলি বারজিলে

18

একটি ল্যাম্বদা হ'ল একটি বেনাম ফাংশন - কোনও ফাংশন যার নাম নেই।



7
ভাষাটি যদি আপনাকে নেস্টেড ফাংশনগুলি ডিক্লেয়ার করতে দেয় তবে একটি নামকৃত ফাংশন হতে পারে।
সিএওও

4
এটিকে "নিম্নমানের পোস্টগুলি" পর্যালোচনা ট্যাবটিতে উন্নত উত্তরের সাথে তৈরি করার জন্য কুডোস।
ইন্নিস

@ জাফডবিবলব্রক্স - ইচ্ছাকৃতভাবে নয়, আমি আপনাকে আশ্বাস দিতে পারি।
ওদে

সত্যিই নয়, lambdaস্কিমের একটি অভিব্যক্তি হ'ল নামহীন অভিব্যক্তির মতো function- তবে পরে তাদের নাম দেওয়ার ক্ষেত্রে আপনাকে থামিয়ে দেওয়ার কিছুই নেই। উদাহরণস্বরূপ var f = [function(x){return x;}][0]। আপনি তর্ক করতে পারেন যে ফাংশনটির মানটির কোনও নাম নেই, তবে এটি সমস্ত ফাংশনের ক্ষেত্রে সত্য হবে ...
এলি বারজিলে


8

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

ল্যামডা এক্সপ্রেশন নিচে ভাঙা যাবে অভিব্যক্তি ল্যামডা এবং বিবৃতি ল্যামডা

এক্সপ্রেশন লাম্বদা:

(int x, string y) => x == y.Length 

বিবৃতি (গুলি) বন্ধনী দ্বারা আবদ্ধ ব্যতীত বিবৃতি ল্যাম্বডা এক্সপ্রেশন ল্যাম্বদার সাথে সমান:

(int x, string y) => {
         if (x == y.Length) {
             Console.WriteLine(y);
         }
}

যখন আমরা জাভাস্ক্রিপ্টে ল্যাম্বডা এক্সপ্রেশন সম্পর্কে কথা বলি যা মূলত কেবল একটি ফাংশনটিকে অন্য ফাংশনে ডাকে একটি আর্গুমেন্ট হিসাবে ব্যবহার করা।

var calculate = function(x, y, operation){
    return operation(x, y);
}

// we're passing anonymous function as a third argument
calculate(10, 15, function(x, y) {
    return x + y;
}); // 25

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

4

টি এল; ডিআর;

দীর্ঘ সংস্করণ

আমি এই বিষয়টিতে কিছুটা ব্যাখ্যা করতে চাই কারণ এটি আমার কাছে খুব আকর্ষণীয় মনে হয়েছে। দাবি অস্বীকার: আমি লম্বা ক্যালকুলাসে আমার কোর্সটি অনেক আগে নিয়েছি। যদি আরও ভাল জ্ঞানের অধিকারী কেউ আমার উত্তরে কোনও ত্রুটি খুঁজে পায় তবে এটিকে উন্নত করতে আমাকে নির্দ্বিধায় সাহায্য করুন।

আসুন এক্সপ্রেশন দিয়ে শুরু করা যাক, 1 + 2এবং x + 2। যেমন লিটারেল 1এবং 2বলা হয় ধ্রুবক কারণ তারা নির্দিষ্ট নির্দিষ্ট মান আবদ্ধ হয়।

যেমন একটি সনাক্তকারীকে পরিবর্তনশীলx বলা হয় এবং এটি মূল্যায়নের জন্য আপনাকে প্রথমে এটি কোনও মানকে আবদ্ধ করতে হবে। সুতরাং, মূলত আপনি x + 1যতক্ষণ জানেন না ততক্ষণ মূল্যায়ন করতে পারবেন না x

ল্যাম্বডে নোটেশনটি ভেরিয়েবলগুলিতে নির্দিষ্ট ইনপুট মানগুলিকে আবদ্ধ করার জন্য একটি স্কিমা সরবরাহ করে। একটি ল্যাম্বডা এক্সপ্রেশনλx . একটি বিদ্যমান এক্সপ্রেশন এর সামনে যোগ করে গঠিত হতে পারে , যেমন λx . x + 1। চলক xমনে করা হয় বিনামূল্যে মধ্যে x + 1এবং আবদ্ধ মধ্যেλx . x + 1

কীভাবে এটি এক্সপ্রেশন মূল্যায়নে সহায়তা করে? আপনি যদি ল্যাম্বডা এক্সপ্রেশনকে কোনও মান খাওয়ান, ঠিক তেমন

(λx . x + 1) 2

তারপরে আপনি ভেরিয়েবলের সমস্ত উপস্থিতি x2 মান দিয়ে প্রতিস্থাপন (বাঁধাই) দ্বারা সম্পূর্ণ অভিব্যক্তিটি মূল্যায়ন করতে পারেন :

(λ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

সুতরাং বাধ্যবাধকতা একই। স্বজ্ঞাতভাবে, আমি আরও জটিল ল্যাম্বডা অভিব্যক্তির একটি অংশকে উপস্থাপন হিসাবে বন্ধের কথা ভাবি। যখন এই উপস্থাপনাটি তৈরি করা হয়, তখন মাতৃগর্ভরতার কিছু বাঁধাই ইতিমধ্যে সেট হয়ে গেছে এবং মূল্যায়ন / অনুরোধ করা হলে বন্ধটি পরে তাদের ব্যবহার করে।


আমি কেবল একজন শিক্ষানবিস, তবে আমি মনে করি আপনি যদি গাণিতিক দিক থেকে ক্যালকুলাসটি বোঝার চেষ্টা করছেন তবে এটি কিছুটা বিভ্রান্তিকর হতে পারে, যেহেতু আপনি ধ্রুবককে যাকে বলছেন তাকে ভেরিয়েবল বলা হয় এবং একটি, বি, সি ... চিহ্নগুলি দ্বারা চিহ্নিত করা হয় আপনি কী কল ভেরিয়েবলগুলি একটি নির্ধারিত ভেরিয়েবল x হবে । অন্যদিকে 1 হ'ল λ এফ এক্সf x , 2 হ'ল λ f xf ( f x ) ইত্যাদি।
jinewee

@ জিনাউই: আমি স্বীকার করি আমি সঠিক সংজ্ঞাটি দেখিনি। আমি যুক্তিতে ভেরিয়েবল এবং ধ্রুবক পদগুলি ব্যবহার করে মনে করি। সেখানে, একটি ধ্রুবক একটি প্রতীক যা ডোমেনে ম্যাপ করা হয়, যখন একটি ভেরিয়েবল এমন প্রতীক যা আপনি পরিমাণ নির্ধারণ করতে পারেন। তবে, আবার, (১) অনেক দিন আগে যেহেতু আমি যুক্তি নিয়ে কোর্স করেছি এবং (২) ল্যাম্বডা-ক্যালকুলাসের গাণিতিক যুক্তির ধারণাগুলি 1-1 অনুসরণ করা দরকার না। আপনি যদি আমাকে কোনও রেফারেন্স দেখায় আমি চেষ্টা করতে পারি এবং আমার পরিভাষা ঠিক করতে পারি।
জর্জিও

0

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

জাভাস্ক্রিপ্ট ES6 (2015) এ ল্যাম্বডাস সংজ্ঞায়িত করার জন্য একটি সংক্ষিপ্ত বাক্য গঠন আছে যার নাম "তীর ফাংশন" । সি শার্প এই ধরনের বাক্য গঠন (2006 প্রায়) .NET 3.0 চালু হয়

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.