लैम्ब्डा कैलकुलस 30 के दशक में अलोंजो चर्च द्वारा आविष्कार किया गया एक संगणना मॉडल है। अधिकांश कार्यात्मक प्रोग्रामिंग भाषाओं के वाक्यविन्यास और शब्दार्थ लैम्ब्डा कैलकुलस से प्रत्यक्ष या अप्रत्यक्ष रूप से प्रेरित होते हैं।
अपने सबसे बुनियादी रूप में लैम्ब्डा कैलकुलस के दो ऑपरेशन हैं: एब्सट्रैक्शन (एक (अनाम) फ़ंक्शन) और एप्लिकेशन (एक फ़ंक्शन लागू करें)। Λ ऑपरेटर का उपयोग करके एब्सट्रैक्शन किया जाता है, लैम्ब्डा पथरी को उसका नाम दिया जाता है।
- लम्बोदर भाव
- लैम्ब्डा कार्य करता है
बेनामी फ़ंक्शंस को अक्सर "लंबदा", "लैम्ब्डा फ़ंक्शंस" या "लैम्ब्डा एक्सप्रेशंस" कहा जाता है क्योंकि, जैसा कि मैंने ऊपर कहा, लैंबडा कैलकुलस में अनाम फ़ंक्शन बनाने के लिए λ प्रतीक था (और शब्द lambda
का उपयोग कई लिस्प में अनाम कार्यों को बनाने के लिए किया जाता है एक ही कारण के लिए -based भाषाओं)।
यह आमतौर पर इस्तेमाल किया जाने वाला शब्द नहीं है, लेकिन मुझे लगता है कि इसका अर्थ है अनाम कार्यों का उपयोग करना या उच्च-क्रम के कार्यों का उपयोग करके प्रोग्रामिंग करना।
C ++ 0x में लैम्ब्डा के बारे में थोड़ी अधिक जानकारी, उनकी प्रेरणा और वे फंक्शन पॉइंटर्स से कैसे संबंधित हैं (यह बहुत संभवतया एक दोहराव है जो आप पहले से जानते हैं, लेकिन मुझे आशा है कि यह लैम्ब्डा की प्रेरणा को समझाने में मदद करता है और वे कैसे भिन्न होते हैं समारोह के संकेत से):
फ़ंक्शन पॉइंटर्स, जो पहले से ही सी में मौजूद थे, उदाहरण के लिए एक छँटाई फ़ंक्शन के लिए एक तुलना फ़ंक्शन पास करने के लिए काफी उपयोगी हैं। हालाँकि उनकी उपयोगिता की सीमाएँ हैं:
उदाहरण के लिए यदि आप i
प्रत्येक वेक्टर (जहां i
एक रन-टाइम पैरामीटर है) के वें तत्व द्वारा वैक्टर के वेक्टर को क्रमबद्ध करना चाहते हैं , तो आप इसे फ़ंक्शन पॉइंटर से हल नहीं कर सकते। एक फ़ंक्शन जो अपने i
वें तत्व द्वारा दो वैक्टर की तुलना करता है , उसे तीन तर्क ( i
और दो वैक्टर) लेने की आवश्यकता होगी, लेकिन सॉर्टिंग फ़ंक्शन को दो तर्क लेने वाले फ़ंक्शन की आवश्यकता होगी। हमें जिस चीज़ की आवश्यकता होगी, वह किसी तरह से i
फ़ंक्शन को तर्क को आपूर्ति करने से पहले छँटाई समारोह में पास करने का एक तरीका है , लेकिन हम सादे कार्यों के साथ ऐसा नहीं कर सकते।
इसे हल करने के लिए, C ++ ने "फ़ंक्शन ऑब्जेक्ट्स" या "फ़ंक्शनलर्स" की अवधारणा पेश की। एक फंटर मूल रूप से एक वस्तु है जिसमें एक operator()
विधि है। अब हम एक वर्ग को परिभाषित कर सकते हैं CompareByIthElement
, जो तर्क i
को एक रचनाकार तर्क के रूप में लेता है और फिर दो वैक्टर को तर्क के रूप में operator()
विधि की तुलना में ले जाता है । i
वें तत्व द्वारा वैक्टर के एक वेक्टर को सॉर्ट करने के लिए अब हम एक CompareByIthElement
ऑब्जेक्ट i
को एक तर्क के रूप में बना सकते हैं और फिर उस ऑब्जेक्ट को सॉर्टिंग फ़ंक्शन में पास कर सकते हैं ।
चूँकि फंक्शन ऑब्जेक्ट्स ऑब्जेक्ट्स होते हैं न कि तकनीकी रूप से फ़ंक्शंस (भले ही वे उनके जैसा व्यवहार करने के लिए हों), आप फंक्शन पॉइंटर पॉइंट को फंक्शन ऑब्जेक्ट के लिए नहीं बना सकते हैं (आप निश्चित रूप से एक फंक्शन ऑब्जेक्ट के लिए पॉइंटर कर सकते हैं, लेकिन यह एक प्रकार होगा CompareByIthElement*
और इस तरह एक फ़ंक्शन पॉइंटर नहीं होगा)।
C ++ मानक लाइब्रेरी में अधिकांश कार्य जो तर्कों के रूप में कार्य करते हैं उन्हें टेम्प्लेट का उपयोग करके परिभाषित किया जाता है ताकि वे फ़ंक्शन पॉइंटर्स के साथ-साथ फ़ंक्शन ऑब्जेक्ट्स के साथ काम करें।
अब लंबोदर को:
i
वें तत्व से तुलना करने के लिए एक पूरी कक्षा को परिभाषित करना थोड़ा क्रिया है यदि आप केवल एक वेक्टर को क्रमबद्ध करने के लिए एक बार उपयोग करने जा रहे हैं। यहां तक कि अगर आपको केवल फ़ंक्शन पॉइंटर की आवश्यकता है, तो एक नामित फ़ंक्शन को परिभाषित करना उप-इष्टतम है यदि यह केवल एक बार उपयोग किया जाता है, तो) यह नाम और बी को प्रदूषित करता है) फ़ंक्शन आमतौर पर बहुत छोटा होने वाला है और वास्तव में नहीं है अपने स्वयं के फ़ंक्शन में तर्क को अमूर्त करने का एक अच्छा कारण (इसके अलावा आप एक फ़ंक्शन को परिभाषित किए बिना फ़ंक्शन पॉइंटर्स नहीं कर सकते हैं)।
तो इसे ठीक करने के लिए इस लंबोदर को पेश किया गया था। लम्बदा फ़ंक्शन ऑब्जेक्ट्स हैं, न कि फ़ंक्शन पॉइंटर्स। यदि आप एक लैम्ब्डा शाब्दिक का उपयोग करते हैं जैसे [x1, x2](y1,y2){bla}
कोड उत्पन्न होता है जो मूल रूप से निम्न कार्य करता है:
- एक वर्ग को परिभाषित करें जिसमें दो सदस्य चर (
x1
और x2
) और operator()
तर्कों ( y1
और y2
) और शरीर के साथ हैं bla
।
- सदस्य चर को सेट करने
x1
और चर x2
के मानों x1
और x2
वर्तमान में दायरे में वर्ग का एक उदाहरण बनाएं ।
तो लैम्ब्डा फ़ंक्शन ऑब्जेक्ट्स की तरह व्यवहार करते हैं, सिवाय इसके कि आप लैम्बडा का उपयोग करने के अलावा किसी भी तरह से लैम्बडा को लागू करने के लिए उत्पन्न वर्ग तक नहीं पहुंच सकते। नतीजतन, कोई भी फ़ंक्शन जो तर्कों के रूप में तर्कों को स्वीकार करता है (मूल रूप से मानक पुस्तकालय में किसी भी गैर-सी फ़ंक्शन का अर्थ है), लैम्ब्डा को स्वीकार करेगा, लेकिन कोई भी फ़ंक्शन केवल फ़ंक्शन पॉइंटर्स को स्वीकार नहीं करेगा।