एक फंक्शन और एक लैम्ब्डा में क्या अंतर है?


54

मैं 'फंक्शन ’और about लैंबडा’ को लेकर थोड़ा भ्रमित हूं। मैंने कुछ उदाहरणों को दिखाते हुए कहा है कि योजना कीवर्ड lambdaजावास्क्रिप्ट कीवर्ड के समान ही काम करता है function, लेकिन मैं वास्तव में नहीं जानता कि वे कैसे संबंधित हैं।

मुझे बताया गया है कि 'फंक्शन' और 'मेथड' को '.net' में ऑब्जेक्ट्स के बारे में बोलते समय इंटरचेंज का इस्तेमाल किया जा सकता है। मैं सोच रहा हूं कि क्या 'लंबोदर' और 'फंक्शन' का एक जैसा मतलब है। मुझे आश्चर्य है कि अगर 'लैम्ब्डा' का कुछ गूढ़ अर्थ है, तो यह देखते हुए कि इस साइट पर इतने सारे अवतारों में ग्रीक अक्षर लैम्ब्डा (λ) दिखाई देता है। .Net में, चीजों को और भी अधिक भ्रमित करने के लिए, C # के कार्यात्मक भागों को संदर्भित करने के लिए फ़ंक्शन फ़ंक्शन एक अन्य फ़ंक्शन को 'लैम्ब्डा एक्सप्रेशंस' के रूप में दिया जाता है, इसलिए शब्द वास्तव में सभी जगह लगता है।

मैं 'लैम्ब्डा कैलकुलस' शब्द से भी वाकिफ हूं।

एक फंक्शन और एक लैम्ब्डा में क्या अंतर है?


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.एक आशा है कि यह लैम्ब्डा कैलकुलस के संदर्भ में होगा, लेकिन मुझे एक अजीब लग रहा है कि हाफ लाइफ को लैम्ब्डा अवतारों को दोष देना है।
यानिस १is'१२

3
पर्याप्त रूप से, यहां
स्टैकओवरफ्लो

@ZaphodBeeblebrox: मुझे संदेह है कि आप हाफ-लाइफ प्रभाव के बारे में सही हैं। : /
FrustratedWithFormsDesigner

जवाबों:


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अपने आप से एक नाम न बनाने के लिए : यह एक महत्वपूर्ण विशेषता है, क्योंकि यह फ़ंक्शन रूपों से नाम देने को अलग करता है ... IMO JS उन लोगों के लिए एक वैकल्पिक नाम स्वीकार करते समय अलगाव की अनुमति देने में सही काम कर रहा है, जो उस पर भयभीत होंगे बिना किसी नाम के फ़ंक्शन का विचार। (और सौभाग्य से उन द्रव्यमानों का आकार सामान्य गिरावट में है ...)
एली बरज़िले

18

एक लंबोदर बस एक अनाम फ़ंक्शन है - एक फ़ंक्शन जिसका कोई नाम नहीं है।


4
नोट काफी: लैम्ब्डा में राज्य शामिल हो सकते हैं (जैसा कि बंद होता है) कि वे उस संदर्भ से अलग हो जाते हैं जहां वे घोषित किए जाते हैं।
मार्टिन जॉर्ज

7
तो एक नामित फ़ंक्शन, यदि भाषा आपको नेस्टेड फ़ंक्शन की घोषणा करने देती है।
काओ

4
कुडोस ने इसे उत्क्रमित उत्तर के साथ "कम गुणवत्ता वाले पदों" की समीक्षा टैब में बनाने के लिए किया।
यानिस

@ZaphodBeeblebrox - जानबूझकर नहीं, मैं आपको आश्वस्त कर सकता हूं।
ओडेड

वास्तव में, lambdaस्कीम में एक functionअभिव्यक्ति बिना किसी नाम के एक अभिव्यक्ति की तरह है - लेकिन बाद में उन्हें नाम देने से कुछ भी नहीं होता है। उदाहरण के लिए var f = [function(x){return x;}][0]। आप तर्क दे सकते हैं कि फ़ंक्शन मान का कोई नाम नहीं है, लेकिन यह सभी कार्यों के लिए सही होगा ...
एली बरज़िले


8

C # बेनामी फ़ंक्शन में एक सामान्य शब्द है जिसमें लैम्बडा एक्सप्रेशन और अनाम तरीके दोनों शामिल हैं (अनाम विधियाँ कोई वास्तविक विधि घोषणा के साथ प्रतिनिधि उदाहरण हैं)।

लैम्ब्डा एक्सप्रेशन को लैम्ब्डा और स्टेटमेंट लैम्बडा को तोड़ दिया जा सकता है

अभिव्यक्ति लंबोदर:

(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

तब आप xमान 2 के साथ चर की सभी घटनाओं को बदलकर (बाध्यकारी) करके पूरी अभिव्यक्ति का मूल्यांकन कर सकते हैं :

(λx . x + 1) 2
      2 + 1
      3

तो, लैम्ब्डा संकेतन चीजों को एक अभिव्यक्ति / प्रोग्राम ब्लॉक में आने वाले चर के लिए बाध्यकारी करने के लिए एक सामान्य तंत्र प्रदान करता है। संदर्भ के आधार पर, यह प्रोग्रामिंग भाषाओं में अलग-अलग अवधारणाएं बनाता है:

  • हास्केल जैसी विशुद्ध रूप से कार्यात्मक भाषा में, लैम्ब्डा अभिव्यक्तियाँ गणितीय अर्थों में कार्यों का प्रतिनिधित्व करती हैं: एक इनपुट मूल्य को लैम्बडा के शरीर में इंजेक्ट किया जाता है और एक आउटपुट मूल्य का उत्पादन किया जाता है।
  • कई भाषाओं में (जैसे जावास्क्रिप्ट, पायथन, स्कीम) एक लैम्ब्डा अभिव्यक्ति के शरीर का मूल्यांकन करने के दुष्प्रभाव हो सकते हैं। इस मामले में एक शब्द का उपयोग कर सकते प्रक्रिया अंतर wrt शुद्ध कार्यों को चिह्नित करने के।

मतभेदों के अलावा, लैम्ब्डा संकेतन औपचारिक मापदंडों को परिभाषित करने और उन्हें वास्तविक मापदंडों से बांधने के बारे में है।

अगला कदम, फ़ंक्शन / प्रक्रिया को एक नाम देना है। कई भाषाओं में, फ़ंक्शन किसी भी अन्य की तरह मान हैं, इसलिए आप किसी फ़ंक्शन को निम्नानुसार नाम दे सकते हैं:

(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

कुछ भाषाएँ, जैसे C, केवल परिभाषित (नामित) कार्यों के लिए उत्तरार्द्ध अंकन का समर्थन करती हैं।

बंद

क्लोजर के संबंध में कुछ अंतिम टिप्पणियां । अभिव्यक्ति पर विचार करें x + y। इसमें दो मुक्त चर शामिल हैं। यदि आप xलैम्बडा नोटेशन का उपयोग करते हुए बांधते हैं, तो आपको :

\x -> x + y

यह एक फ़ंक्शन नहीं है (अभी तक) क्योंकि इसमें अभी भी एक मुफ्त चर शामिल है y। आप इसे बाइंड करके एक फंक्शन बना सकते हैं y:

\x -> \y -> x + y

या

\x y -> x + y

जो कि +फंक्शन की तरह ही है ।

लेकिन आप इसे yदूसरे तरीके से (*) बाँध सकते हैं :

incrementBy y = \x -> x + y

फ़ंक्शन incrementBy को एक नंबर पर लागू करने का परिणाम एक क्लोजर है, अर्थात एक फ़ंक्शन / प्रक्रिया जिसके शरीर में एक निशुल्क चर (जैसे y) होता है जो उस वातावरण से एक मूल्य के लिए बाध्य किया गया है जिसमें क्लोजर को परिभाषित किया गया था।

तो incrementBy 5फ़ंक्शन (बंद) है जो 5 से संख्या बढ़ाता है।

ध्यान दें (*)

मैं यहाँ थोड़ा धोखा दे रहा हूँ:

incrementBy y = \x -> x + y

के बराबर है

incrementBy = \y -> \x -> x + y

इसलिए बाध्यकारी तंत्र समान है। सहज रूप से, मैं एक क्लोजर के बारे में सोचता हूं जो एक अधिक जटिल लैम्ब्डा अभिव्यक्ति का हिस्सा है। जब यह प्रतिनिधित्व बनाया जाता है, तो माँ की अभिव्यक्ति के कुछ बाइंडिंग पहले ही सेट हो चुके होते हैं और जब उनका मूल्यांकन / चालान हो जाता है, तो क्लोजर बाद में उनका उपयोग करता है।


Im एक भिखारी है, लेकिन मुझे लगता है कि यह थोड़ा भ्रमित हो सकता है यदि आप गणितीय अर्थ में λ कलन को समझने की कोशिश कर रहे हैं, क्योंकि जिसे आप स्थिरांक कहते हैं उसे चर कहा जाता है और प्रतीकों द्वारा निरूपित किया जाता है a, b, c ... क्या आप कॉल चर एक अनिर्धारित चर x होगा । दूसरी तरफ 1 λ f x हैf x , 2 λ f x हैf ( f x ) वगैरह
jinawee

@jinawee: मैं मानता हूं कि मैंने सटीक परिभाषा नहीं दी थी। मुझे याद है कि तर्क में शब्द चर और स्थिरांक का उपयोग करना चाहिए। वहाँ, एक स्थिरांक एक प्रतीक है जो एक डोमेन पर मैप किया जाता है, जबकि एक चर एक ऐसा प्रतीक है जिसे आप ऊपर मात्रा दे सकते हैं। लेकिन, फिर से, (1) यह एक लंबे समय से पहले है क्योंकि मैंने तर्क पर एक कोर्स किया है, और (2) लैम्ब्डा-कैलकुलस को गणितीय तर्क की 1-1 अवधारणाओं का पालन करने की आवश्यकता नहीं है। यदि आप मुझे एक संदर्भ के लिए इंगित करते हैं तो मैं अपनी शब्दावली को ठीक करने की कोशिश कर सकता हूं।
जियोर्जियो

0

प्रोग्रामिंग में "लैम्ब्डा" का अर्थ आमतौर पर "लैम्ब्डा फ़ंक्शन" (या "लैम्ब्डा एक्सप्रेशन", "लैम्ब्डा टर्म") भी होता है। जब फ़ंक्शन अपने उपयोग से पहले परिभाषित कोड का एक नामित ब्लॉक होता है, तो "लैम्बडा फ़ंक्शन" कोड का एक ब्लॉक होता है (या एक अभिव्यक्ति) उपयोग के स्थान पर परिभाषित किया जाता है जिसे एक प्रोग्रामिंग भाषा में प्रथम श्रेणी के नागरिक के रूप में इस्तेमाल किया जा सकता है।

जावास्क्रिप्ट ईएस 6 (2015) में "एरो फंक्शंस" नामक लैम्ब्डा को परिभाषित करने के लिए एक छोटा वाक्यविन्यास है । C # में ऐसा सिंटैक्स .NET 3.0 (2006 के आसपास) में पेश किया गया था

गणित में "फंक्शन" धारणा के कई अर्थ होते हैं, जिनमें से एक का अर्थ फ़ंक्शन के नोटेशन (यानी इसे कैसे लिखना है) के बारे में है, तो "लैम्ब्डा फ़ंक्शन" (कैलकुलस में) एक विशेष प्रकार का फ़ंक्शन नोटेशन है। अधिक चर्चा के लिए प्रोग्रामिंग भाषाओं में लैम्बडा फ़ंक्शन की जाँच करें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.