कंप्यूटर विज्ञान की दुनिया में एक लैम्ब्डा के बिना एक व्यक्ति के लिए क्या है?
कंप्यूटर विज्ञान की दुनिया में एक लैम्ब्डा के बिना एक व्यक्ति के लिए क्या है?
जवाबों:
लैम्ब्डा लैम्बडा कैलकुलस से आता है और प्रोग्रामिंग में अनाम कार्यों को संदर्भित करता है।
यह शांत क्यों है? यह आपको उनका नाम लिए बिना त्वरित थ्रो फ़ंक्शंस लिखने की अनुमति देता है। यह क्लोजर लिखने का एक अच्छा तरीका भी प्रदान करता है। उस शक्ति से आप इस तरह की चीजें कर सकते हैं।
अजगर
def adder(x):
return lambda y: x + y
add5 = adder(5)
add5(1)
6
जैसा कि आप पायथन के स्निपेट से देख सकते हैं, फ़ंक्शन एडिटर एक तर्क x में लेता है, और एक अनाम फ़ंक्शन, या लैम्ब्डा लौटाता है, जो एक और तर्क y लेता है। वह अनाम फ़ंक्शन आपको फ़ंक्शन से फ़ंक्शन बनाने की अनुमति देता है। यह एक सरल उदाहरण है, लेकिन इसे पावर लंबोदा और क्लोजर को व्यक्त करना चाहिए।
अन्य भाषाओं में उदाहरण
पर्ल ५
sub adder {
my ($x) = @_;
return sub {
my ($y) = @_;
$x + $y
}
}
my $add5 = adder(5);
print &$add5(1) == 6 ? "ok\n" : "not ok\n";
जावास्क्रिप्ट
var adder = function (x) {
return function (y) {
return x + y;
};
};
add5 = adder(5);
add5(1) == 6
जावास्क्रिप्ट (ES6)
const adder = x => y => x + y;
add5 = adder(5);
add5(1) == 6
योजना
(define adder
(lambda (x)
(lambda (y)
(+ x y))))
(define add5
(adder 5))
(add5 1)
6
Func<int, Func<int, int>> adder =
(int x) => (int y) => x + y; // `int` declarations optional
Func<int, int> add5 = adder(5);
var add6 = adder(6); // Using implicit typing
Debug.Assert(add5(1) == 6);
Debug.Assert(add6(-1) == 5);
// Closure example
int yEnclosed = 1;
Func<int, int> addWithClosure =
(x) => x + yEnclosed;
Debug.Assert(addWithClosure(2) == 3);
तीव्र
func adder(x: Int) -> (Int) -> Int{
return { y in x + y }
}
let add5 = adder(5)
add5(1)
6
पीएचपी
$a = 1;
$b = 2;
$lambda = fn () => $a + $b;
echo $lambda();
हास्केल
(\x y -> x + y)
जावा इस पोस्ट को देखें
// The following is an example of Predicate :
// a functional interface that takes an argument
// and returns a boolean primitive type.
Predicate<Integer> pred = x -> x % 2 == 0; // Tests if the parameter is even.
boolean result = pred.test(4); // true
लुआ
adder = function(x)
return function(y)
return x + y
end
end
add5 = adder(5)
add5(1) == 6 -- true
Kotlin
val pred = { x: Int -> x % 2 == 0 }
val result = pred(4) // true
माणिक
रूबी इसमें थोड़ा भिन्न है कि आप किसी फ़ंक्शन को कॉल करने के समान सटीक सिंटैक्स का उपयोग करके एक लैम्ब्डा को कॉल नहीं कर सकते हैं, लेकिन इसमें अभी भी लैम्बडा है।
def adder(x)
lambda { |y| x + y }
end
add5 = adder(5)
add5[1] == 6
रूबी रूबी होने के नाते, लैम्ब्डा के लिए एक आशुलिपि है, इसलिए आप adder
इस तरह से परिभाषित कर सकते हैं :
def adder(x)
-> y { x + y }
end
आर
adder <- function(x) {
function(y) x + y
}
add5 <- adder(5)
add5(1)
#> [1] 6
एक लैम्ब्डा एक प्रकार का फ़ंक्शन है, जो परिभाषित इनलाइन है। एक लैम्ब्डा के साथ-साथ आपके पास आमतौर पर कुछ प्रकार के चर प्रकार भी होते हैं जो किसी फ़ंक्शन, लैम्ब्डा या अन्यथा के संदर्भ में पकड़ सकते हैं।
उदाहरण के लिए, यहाँ एक # कोड का टुकड़ा है जो लैम्बडा का उपयोग नहीं करता है:
public Int32 Add(Int32 a, Int32 b)
{
return a + b;
}
public Int32 Sub(Int32 a, Int32 b)
{
return a - b;
}
public delegate Int32 Op(Int32 a, Int32 b);
public void Calculator(Int32 a, Int32 b, Op op)
{
Console.WriteLine("Calculator: op(" + a + ", " + b + ") = " + op(a, b));
}
public void Test()
{
Calculator(10, 23, Add);
Calculator(10, 23, Sub);
}
यह कैलकुलेटर कहता है, न केवल दो संख्याओं के साथ, लेकिन गणना के परिणाम प्राप्त करने के लिए कैलकुलेटर के अंदर कॉल करने की कौन सी विधि है।
C # 2.0 में हमें अनाम विधियाँ मिलीं, जो उपरोक्त कोड को निम्न करता है:
public delegate Int32 Op(Int32 a, Int32 b);
public void Calculator(Int32 a, Int32 b, Op op)
{
Console.WriteLine("Calculator: op(" + a + ", " + b + ") = " + op(a, b));
}
public void Test()
{
Calculator(10, 23, delegate(Int32 a, Int32 b)
{
return a + b;
});
Calculator(10, 23, delegate(Int32 a, Int32 b)
{
return a - b;
});
}
और फिर C # 3.0 में हमें लैम्ब्डा मिला जो कोड को और भी छोटा बनाता है:
public delegate Int32 Op(Int32 a, Int32 b);
public void Calculator(Int32 a, Int32 b, Op op)
{
Console.WriteLine("Calculator: op(" + a + ", " + b + ") = " + op(a, b));
}
public void Test()
{
Calculator(10, 23, (a, b) => a + b);
Calculator(10, 23, (a, b) => a - b);
}
Op
, एक का उपयोग कर सकते हैंFunc<int, int>
Console.WriteLine("Calculator: op " + op.Method.Name + " (" + a + ", " + b + ") = " + op(a, b));
पहले उदाहरण के लिए सुझाव दूंगा।
"लैम्ब्डा" नाम केवल एक ऐतिहासिक कलाकृति है। हम सभी के बारे में बात कर रहे हैं एक अभिव्यक्ति है जिसका मूल्य एक फ़ंक्शन है।
एक सरल उदाहरण (अगली पंक्ति के लिए स्काला का उपयोग करना) है:
args.foreach(arg => println(arg))
जहां foreach
विधि का तर्क एक अनाम फ़ंक्शन के लिए एक अभिव्यक्ति है। उपरोक्त पंक्ति कमोबेश कुछ इस तरह से लिखी जा रही है (बिल्कुल वास्तविक कोड नहीं है, लेकिन आपको यह विचार मिलेगा):
void printThat(Object that) {
println(that)
}
...
args.foreach(printThat)
सिवाय इसके कि आपको परेशान करने की आवश्यकता नहीं है:
एक बार जब आप मानों का उपयोग करने के लिए उपयोग किए जाते हैं, तो उनके बिना करना हर अभिव्यक्ति को नाम देने के लिए उतना ही मूर्खतापूर्ण लगता है, जैसे कि:
int tempVar = 2 * a + b
...
println(tempVar)
इसके बजाय सिर्फ अभिव्यक्ति को लिखने के लिए जहाँ आपको इसकी आवश्यकता है:
println(2 * a + b)
सटीक अंकन भाषा से भाषा में भिन्न होता है; ग्रीक हमेशा आवश्यक नहीं है! ;-)
यह लैम्ब्डा कैलकुलस को संदर्भित करता है , जो एक औपचारिक प्रणाली है जिसमें सिर्फ लैम्ब्डा अभिव्यक्ति है, जो एक फ़ंक्शन का प्रतिनिधित्व करता है जो अपने एकमात्र तर्क के लिए एक फ़ंक्शन लेता है और एक फ़ंक्शन देता है। लैम्ब्डा कैलकुलस में सभी कार्य उस प्रकार के होते हैं, अर्थात λ : λ → λ
।
लिस्प ने लैम्बडा अवधारणा का उपयोग अपने अनाम फ़ंक्शन शाब्दिक नाम के लिए किया। यह लंबो एक फ़ंक्शन का प्रतिनिधित्व करता है जो दो तर्क लेता है, x और y, और उनके उत्पाद को लौटाता है:
(lambda (x y) (* x y))
इसे इस तरह लागू किया जा सकता है ( 50 का मूल्यांकन ):
((lambda (x y) (* x y)) 5 10)
λ : λ -> λ
भ्रामक है (और वास्तव में अमान्य है)।
लैम्ब्डा कैलकुलस प्रतिस्थापन का एक सुसंगत गणितीय सिद्धांत है। स्कूल गणित में एक उदाहरण के लिए देखता है x+y=5
के साथ रखा x−y=1
। व्यक्तिगत समीकरणों में हेरफेर करने के तरीकों के साथ-साथ इन दोनों की जानकारी को एक साथ रखना भी संभव है, बशर्ते कि क्रॉस-समीकरण विकल्प तार्किक रूप से किए जाएं। लैम्ब्डा कैलकुलस इन प्रतिस्थापनों को करने के लिए सही तरीके से कोड करता है।
यह देखते हुए कि y = x−1
दूसरे समीकरण की एक वैध व्यवस्था है, λ y = x−1
इसका मतलब है : प्रतीक के x−1
लिए प्रतीकों को प्रतिस्थापित करने वाला एक फ़ंक्शन y
। अब λ y
पहले समीकरण में प्रत्येक पद पर आवेदन करने की कल्पना करें । यदि कोई पद है y
तो प्रतिस्थापन करें; अन्यथा कुछ न करें। यदि आप इसे पेपर पर करते हैं, तो आप देखेंगे कि कैसे आवेदन करने λ y
से पहला समीकरण हल हो जाएगा।
यह किसी भी कंप्यूटर विज्ञान या प्रोग्रामिंग के बिना एक जवाब है।
सबसे सरल प्रोग्रामिंग उदाहरण मैं http://en.wikipedia.org/wiki/Joy_(programming_language)#How_it_works से आता है :
यहां बताया गया है कि स्क्वायर फ़ंक्शन को एक अनिवार्य प्रोग्रामिंग भाषा (C) में कैसे परिभाषित किया जा सकता है:
int square(int x) { return x * x; }
चर x एक औपचारिक पैरामीटर है जिसे फ़ंक्शन कहा जाने पर वास्तविक मान से बदल दिया जाता है। एक कार्यात्मक भाषा (योजना) में समान कार्य को परिभाषित किया जाएगा:
(define square (lambda (x) (* x x)))
यह कई मायनों में अलग है, लेकिन यह अभी भी उसी तरह से औपचारिक पैरामीटर x का उपयोग करता है।
जोड़ा गया: http://imgur.com/a/XBHub
थोड़ा-सा ओवरसाइम्प्लिफ़ाइड: एक लैम्ब्डा फ़ंक्शन वह होता है जिसे अन्य कार्यों के लिए राउंड पास किया जा सकता है और यह लॉजिक एक्सेस होता है।
सी # में लैम्ब्डा सिंटैक्स को अक्सर उसी तरीके से सरल तरीकों से संकलित किया जाता है जैसे गुमनाम प्रतिनिधियों को, लेकिन इसे भी तोड़ा जा सकता है और इसके तर्क पढ़े जाते हैं।
उदाहरण के लिए (C # 3 में):
LinqToSqlContext.Where(
row => row.FieldName > 15 );
LinqToSql उस फ़ंक्शन (x> 15) को पढ़ सकता है और इसे अभिव्यक्ति ट्री का उपयोग करके निष्पादित करने के लिए वास्तविक SQL में परिवर्तित कर सकता है।
ऊपर बयान हो जाता है:
select ... from [tablename]
where [FieldName] > 15 --this line was 'read' from the lambda function
यह सामान्य तरीकों या अनाम प्रतिनिधियों (जो वास्तव में सिर्फ संकलक जादू हैं) से अलग है क्योंकि उन्हें पढ़ा नहीं जा सकता है ।
C # में सभी तरीके नहीं जो लैम्ब्डा सिंटैक्स का उपयोग करते हैं, उन्हें अभिव्यक्ति पेड़ों (यानी वास्तविक लैम्ब्डा कार्यों) के लिए संकलित किया जा सकता है। उदाहरण के लिए:
LinqToSqlContext.Where(
row => SomeComplexCheck( row.FieldName ) );
अब अभिव्यक्ति ट्री को नहीं पढ़ा जा सकता है - SomeComplexCheck को तोड़ा नहीं जा सकता। एसक्यूएल स्टेटमेंट जहां के बिना निष्पादित करेगा, और डेटा में प्रत्येक पंक्ति के माध्यम से डाला जाएगा SomeComplexCheck
।
अनाम विधियों के साथ लैम्ब्डा कार्यों को भ्रमित नहीं किया जाना चाहिए। उदाहरण के लिए:
LinqToSqlContext.Where(
delegate ( DataRow row ) {
return row.FieldName > 15;
} );
इसका एक 'इनलाइन' फ़ंक्शन भी है, लेकिन इस बार यह सिर्फ कंपाइलर मैजिक है - C # कंपाइलर इसे ऑटोजेनरेटेड नाम के साथ एक नई इंस्टेंस विधि से विभाजित करेगा।
अनाम विधियों को पढ़ा नहीं जा सकता है, और इसलिए तर्क का अनुवाद नहीं किया जा सकता क्योंकि यह लंबोदर कार्यों के लिए हो सकता है।
मुझे इस लेख में लैम्ब्डा की व्याख्या पसंद है: LINQ का विकास और सी # के डिजाइन पर इसका प्रभाव । यह मेरे लिए बहुत मायने रखता है क्योंकि यह लैम्ब्डा के लिए एक वास्तविक दुनिया दिखाता है और इसे एक व्यावहारिक उदाहरण के रूप में बनाता है।
उनकी त्वरित व्याख्या: लैम्ब्डा डेटा के रूप में कोड (फ़ंक्शन) का इलाज करने का एक तरीका है।
रूबी में एक मेमने का एक उदाहरण इस प्रकार है:
hello = lambda do
puts('Hello')
puts('I am inside a proc')
end
hello.call
निम्नलिखित आउटपुट उत्पन्न करेगा:
Hello
I am inside a proc
@ ब्रायन मैं लिनक्यू और नॉन-लाइनक्यू ऑपरेटरों में सी # के सभी समय का उपयोग करता है। उदाहरण:
string[] GetCustomerNames(IEnumerable<Customer> customers)
{ return customers.Select(c=>c.Name);
}
सी # से पहले, मैंने एजेक्स कार्यों के लिए कॉलबैक के लिए जावास्क्रिप्ट में अनाम कार्यों का उपयोग किया था, इससे पहले कि अजाक्स को भी गढ़ा गया था:
getXmlFromServer(function(result) {/*success*/}, function(error){/*fail*/});
हालांकि, सी # लैंबडा सिंटैक्स के साथ दिलचस्प बात यह है कि अपने दम पर उनके प्रकार का अनुमान नहीं लगाया जा सकता है (यानी, आप var foo = (x, y) => x * y) टाइप नहीं कर सकते हैं, लेकिन वे किस प्रकार पर निर्भर करते हैं सौंपा गया है, वे अभिव्यक्ति का प्रतिनिधित्व करने वाले प्रतिनिधियों या अमूर्त वाक्यविन्यास पेड़ों के रूप में संकलित किए जाएंगे (जो कि LINQ ऑब्जेक्ट मैपर्स उनके "भाषा-एकीकृत" जादू करते हैं)।
एलआईएसपी में लंबोदर को एक उद्धरण ऑपरेटर के पास भी भेजा जा सकता है और फिर सूची की सूची के रूप में ट्रेस किया जा सकता है। कुछ शक्तिशाली मैक्रों को इस तरह से बनाया गया है।
प्रश्न का औपचारिक रूप से बहुत उत्तर दिया गया है, इसलिए मैं इस पर और अधिक जोड़ने की कोशिश नहीं करूंगा।
बहुत सरल में, अनौपचारिक शब्दों में किसी को जो गणित या प्रोग्रामिंग पर बहुत कम या कुछ भी नहीं जानता है, मैं इसे एक छोटे "मशीन" या "बॉक्स" के रूप में समझाऊंगा जो कुछ इनपुट लेता है, कुछ काम करता है और कुछ आउटपुट का उत्पादन करता है, जिसका कोई विशेष नाम नहीं है , लेकिन हम जानते हैं कि यह कहाँ है और इस ज्ञान के द्वारा, हम इसका उपयोग करते हैं।
व्यावहारिक रूप से, एक व्यक्ति के लिए जो जानता है कि एक फ़ंक्शन क्या है, मैं उन्हें बताऊंगा कि यह एक ऐसा फ़ंक्शन है जिसका कोई नाम नहीं है, आमतौर पर स्मृति में एक बिंदु पर रखा जाता है जो कि बस उस मेमोरी का संदर्भ लेकर इस्तेमाल किया जा सकता है (आमतौर पर उपयोग के माध्यम से एक चर - अगर उन्होंने फ़ंक्शन पॉइंटर्स की अवधारणा के बारे में सुना है, तो मैं उन्हें एक समान अवधारणा के रूप में उपयोग करूंगा) - यह उत्तर सुंदर मूल बातें (क्लोजर आदि का कोई उल्लेख नहीं है) को कवर करता है, लेकिन एक बिंदु आसानी से प्राप्त कर सकता है।
आप इसे एक गुमनाम फ़ंक्शन के रूप में सोच सकते हैं - यहां कुछ और जानकारी है: विकिपीडिया - बेनामी फ़ंक्शन
सिर्फ इसलिए कि मैं यहाँ एक C ++ 11 उदाहरण नहीं देख सकता, मैं यहाँ से यह अच्छा उदाहरण पोस्ट करूँगा । खोज करने के बाद, यह सबसे स्पष्ट भाषा विशिष्ट उदाहरण है जो मुझे मिल सकता है।
template<typename F>
void Eval( const F& f ) {
f();
}
void foo() {
Eval( []{ printf("Hello, Lambdas\n"); } );
}
void bar() {
auto f = []{ printf("Hello, Lambdas\n"); };
f();
}
मुझे लैम्बडा एक्सप्रेशंस के आसपास अपना सिर लपेटने में परेशानी होती है क्योंकि मैं विजुअल फॉक्सप्रो में काम करता हूं, जिसमें मैक्रो प्रतिस्थापन और एक्जिकस्क्रिप्ट {} और मूल्यांकन () फंक्शंस हैं, जो एक ही उद्देश्य को पूरा करते हैं।
? Calculator(10, 23, "a + b")
? Calculator(10, 23, "a - b");
FUNCTION Calculator(a, b, op)
RETURN Evaluate(op)
औपचारिक लैम्ब्डा का उपयोग करने का एक निश्चित लाभ (मुझे लगता है) संकलन-समय की जाँच है: फॉक्स को पता नहीं चलेगा कि क्या आप ऊपर दिए गए पाठ स्ट्रिंग को टाइप करते हैं जब तक कि वह इसे चलाने की कोशिश नहीं करता।
यह डेटा-संचालित कोड के लिए भी उपयोगी है: आप डेटाबेस में मेमो फ़ील्ड में संपूर्ण रूटीन संग्रहीत कर सकते हैं और फिर रन-टाइम पर उनका मूल्यांकन कर सकते हैं। यह आपको एप्लिकेशन को वास्तव में स्रोत तक पहुंच के बिना भाग का हिस्सा बनाने देता है। (लेकिन यह एक और विषय है।)
कंप्यूटर विज्ञान की दुनिया में एक लैम्ब्डा के बिना एक व्यक्ति के लिए क्या है?
मैं इसे सरल और पठनीय पायथन कोड में सहज ज्ञान युक्त कदम से समझाऊंगा।
संक्षेप में, एक लंबोदर सिर्फ एक अनाम और इनलाइन फ़ंक्शन है।
चलो lambdas
मूल अंकगणित की पृष्ठभूमि के साथ एक नए व्यक्ति के रूप में समझने के लिए असाइनमेंट से शुरू करते हैं।
असाइनमेंट का ब्लूप्रिंट 'नाम = मान' है, देखें:
In [1]: x = 1
...: y = 'value'
In [2]: x
Out[2]: 1
In [3]: y
Out[3]: 'value'
'x', 'y' नाम हैं और 1, 'वैल्यू' मान हैं। गणित में एक समारोह की कोशिश करो
In [4]: m = n**2 + 2*n + 1
NameError: name 'n' is not defined
त्रुटि रिपोर्ट,
आप एक गणितज्ञ को सीधे कोड के रूप में नहीं लिख सकते हैं, 'एन' को परिभाषित किया जाना चाहिए या एक मूल्य को सौंपा जाना चाहिए।
In [8]: n = 3.14
In [9]: m = n**2 + 2*n + 1
In [10]: m
Out[10]: 17.1396
अब यह काम करता है, अगर आप दो सेपरटर लाइनों को एक में मिलाने पर जोर देते हैं। वहाँ आता हैlambda
In [13]: j = lambda i: i**2 + 2*i + 1
In [14]: j
Out[14]: <function __main__.<lambda>>
कोई त्रुटि नहीं बताई गई।
यह एक नज़र है lambda
, यह आपको एक पंक्ति में एक फ़ंक्शन लिखने में सक्षम बनाता है जैसा कि आप सीधे कंप्यूटर में गणित में करते हैं।
हम इसे बाद में देखेंगे।
चलो 'असाइनमेंट' पर गहराई से खुदाई जारी रखें।
जैसा कि ऊपर चित्रित किया गया है, समान चिह्न =
सरल डेटा (1 और 'मान') प्रकार और सरल अभिव्यक्ति (n ** 2 + 2 * n + 1) के लिए काम करता है।
इसे इस्तेमाल करे:
In [15]: x = print('This is a x')
This is a x
In [16]: x
In [17]: x = input('Enter a x: ')
Enter a x: x
यह साधारण कथनों के लिए काम करता है, अजगर में उनके 11 प्रकार हैं । सरल कथन - अजगर 3.6.3 प्रलेखन
कैसे यौगिक बयान के बारे में,
In [18]: m = n**2 + 2*n + 1 if n > 0
SyntaxError: invalid syntax
#or
In [19]: m = n**2 + 2*n + 1, if n > 0
SyntaxError: invalid syntax
वहाँ def
यह काम कर सक्षम बनाता है
In [23]: def m(n):
...: if n > 0:
...: return n**2 + 2*n + 1
...:
In [24]: m(2)
Out[24]: 9
टाडा, इसका विश्लेषण करें, 'एम' नाम है, 'एन ** 2 + 2 * एन + 1' मूल्य है। :
'=' का एक प्रकार है।
इसे ढूंढें, अगर सिर्फ समझ के लिए, सब कुछ असाइनमेंट से शुरू होता है और सब कुछ असाइनमेंट है।
अब लौटते हैं lambda
, हमारे पास 'm' नाम का एक फंक्शन है।
प्रयत्न:
In [28]: m = m(3)
In [29]: m
Out[29]: 16
यहाँ 'एम' के दो नाम हैं, फंक्शन में m
पहले से ही एक नाम है, डुप्लिकेट।
यह स्वरूपण की तरह है:
In [27]: m = def m(n):
...: if n > 0:
...: return n**2 + 2*n + 1
SyntaxError: invalid syntax
यह एक स्मार्ट रणनीति नहीं है, इसलिए त्रुटि रिपोर्ट करती है
हमें उनमें से एक को हटाना होगा, एक नाम के बिना एक फ़ंक्शन सेट करना होगा।
m = lambda n:n**2 + 2*n + 1
इसे 'अनाम फ़ंक्शन' कहा जाता है
निष्कर्ष के तौर पर,
lambda
इनलाइन फ़ंक्शन जो आपको गणित में एक सीधी रेखा में फ़ंक्शन लिखने में सक्षम बनाता हैlambda
अनाम हैउम्मीद है की यह मदद करेगा।
यह एक ऐसा फंक्शन है जिसका कोई नाम नहीं है। उदाहरण के लिए c # में आप उपयोग कर सकते हैं
numberCollection.GetMatchingItems<int>(number => number > 5);
5 से अधिक की संख्या को वापस करने के लिए।
number => number > 5
यहाँ लंबोदर भाग है। यह एक फ़ंक्शन का प्रतिनिधित्व करता है जो एक पैरामीटर (संख्या) लेता है और एक बूलियन मान (संख्या> 5) देता है। GetMatchingItems विधि संग्रह में सभी वस्तुओं पर इस लैम्ब्डा का उपयोग करती है और मिलान वाली वस्तुओं को वापस करती है।
जावास्क्रिप्ट में, उदाहरण के लिए, कार्यों और सब कुछ के रूप में ही मिश्रित प्रकार के रूप में इलाज कर रहे हैं ( int
, string
, float
, bool
)। जैसे, आप फ़्लाई पर फ़ंक्शंस बना सकते हैं, उन्हें चीजों को असाइन कर सकते हैं, और बाद में उन्हें कॉल कर सकते हैं। यह उपयोगी है, लेकिन ऐसा कुछ नहीं जिसे आप उपयोग करना चाहते हैं या आप सभी को भ्रमित करेंगे जिन्हें आपके बाद अपना कोड बनाए रखना है ...
यह कुछ कोड है जो मैं यह देखने के लिए खेल रहा था कि यह खरगोश छेद कितना गहरा है:
var x = new Object;
x.thingy = new Array();
x.thingy[0] = function(){ return function(){ return function(){ alert('index 0 pressed'); }; }; }
x.thingy[1] = function(){ return function(){ return function(){ alert('index 1 pressed'); }; }; }
x.thingy[2] = function(){ return function(){ return function(){ alert('index 2 pressed'); }; }; }
for(var i=0 ;i<3; i++)
x.thingy[i]()()();
सीएस के संदर्भ में एक लंबोदर फ़ंक्शन एक सार गणितीय अवधारणा है जो गणितीय अभिव्यक्तियों के प्रतीकात्मक मूल्यांकन की समस्या से निपटता है। उस संदर्भ में एक लंबदा फ़ंक्शन लंबोदर शब्द के समान है ।
लेकिन प्रोग्रामिंग भाषाओं में यह कुछ अलग है। यह एक कोड का टुकड़ा है जिसे "जगह में" घोषित किया गया है, और जिसे "प्रथम श्रेणी के नागरिक" के रूप में पास किया जा सकता है। यह अवधारणा इसलिए उपयोगी साबित हुई कि यह लगभग सभी लोकप्रिय आधुनिक प्रोग्रामिंग भाषाओं में आ गई (देखें लैम्ब्डा फ़ंक्शंस कहीं भी पोस्ट करें)।
ए
Lambda Function
, या ए ,Small Anonymous Function
कार्यक्षमता का एक आत्म-निहित ब्लॉक है जिसे आपके कोड में इधर-उधर से और पास किया जा सकता है। - Lambda अलग अलग प्रोग्रामिंग भाषाओं में नाम हैंLambda
में अजगर और Kotlin ,Closure
में स्विफ्ट , याBlock
में सी और ऑब्जेक्टिव-सी । हालांकि लैम्बडा का अर्थ इन भाषाओं के लिए काफी समान है लेकिन इसमें कभी-कभी मामूली अंतर होता है।
let coffee: [String] = ["Cappuccino", "Espresso", "Latte", "Ristretto"]
func backward(_ n1: String, _ n2: String) -> Bool {
return n1 > n2
}
var reverseOrder = coffee.sorted(by: backward)
// RESULT: ["Ristretto", "Latte", "Espresso", "Cappuccino"]
reverseOrder = coffee.sorted(by: { (n1: String, n2: String) -> Bool in
return n1 > n2
})
reverseOrder = coffee.sorted(by: { (n1: String, n2: String) -> Bool in return n1 > n2 } )
reverseOrder = coffee.sorted(by: { n1, n2 in return n1 > n2 } )
reverseOrder = coffee.sorted(by: { n1, n2 in n1 > n2 } )
reverseOrder = coffee.sorted(by: { $0 > $1 } )
// $0 and $1 are closure’s first and second String arguments.
reverseOrder = coffee.sorted(by: >)
// RESULT: ["Ristretto", "Latte", "Espresso", "Cappuccino"]
उम्मीद है की यह मदद करेगा।
मुझे भी मिल गया। I`ve ने इसे इस एक के साथ JS में आज़माया:
var addAndMult = function(x) {
return (function(y) {
return (function(z) {
return (x+y)*z;
});
});
};
यह 2 से 4 को जोड़ता है, फिर 6 से परिणाम निकालता है। हालांकि मुझे यह कभी-कभी पढ़ने में कठिन लगता है :(
इसके अलावा, मैं `एक दिलचस्प forEach समारोह बनाया:
var forEach = function(arr) {
return (function(x) {
for (var i=0; arr[i]; i++) {
x(arr[i]);
}
});
}
foreach ([1,2,3,4,5]) (console.log);
यह विधि एक सरणी को पुनरावृत्त करेगी और कंसोल में प्रिंटिंग के मामले में - एक कार्रवाई करेगी। अब मुझे भी पता चल गया है कि लैबमाडा शक्तिशाली क्यों हैं।
कंप्यूटर प्रोग्रामिंग में, लैम्ब्डा कोड (स्टेटमेंट, एक्सप्रेशन या उनमें से एक समूह) का एक टुकड़ा है जो बाहरी स्रोत से कुछ तर्क लेता है। यह हमेशा एक अनाम फ़ंक्शन नहीं होना चाहिए - हमारे पास उन्हें लागू करने के कई तरीके हैं।
हमारे पास अभिव्यक्तियों, कथनों और कार्यों के बीच स्पष्ट अलगाव है, जो गणितज्ञों के पास नहीं है।
प्रोग्रामिंग में "फ़ंक्शन" शब्द भी अलग है - हमारे पास "फ़ंक्शन करने के लिए चरणों की एक श्रृंखला है" (लैटिन "प्रदर्शन" से)। गणित में यह चर के बीच संबंध के बारे में कुछ है।
कार्यात्मक भाषाएं यथासंभव गणित के सूत्रों के समान होने की कोशिश कर रही हैं, और उनके शब्दों का अर्थ लगभग समान है। लेकिन अन्य प्रोग्रामिंग भाषाओं में हमारे पास यह अलग है।
प्रश्न का पूरी तरह से उत्तर दिया गया है, मैं विवरण में नहीं जाना चाहता। मैं जंग में संख्यात्मक गणना लिखते समय उपयोग साझा करना चाहता हूं।
एक मेमना का एक उदाहरण है (अनाम फ़ंक्शन)
let f = |x: f32| -> f32 { x * x - 2.0 };
let df = |x: f32| -> f32 { 2.0 * x };
जब मैं न्यूटन-रैपसन विधि का एक मॉड्यूल लिख रहा था, तो इसका उपयोग पहले और दूसरे क्रम के व्युत्पन्न के रूप में किया गया था। (यदि आप जानना चाहते हैं कि न्यूटन-रैपसन विधि क्या है, तो कृपया " https://en.wikipedia.org/wiki/Newton%27s_method " पर जाएं ।
निम्नलिखित के रूप में उत्पादन
println!("f={:.6} df={:.6}", f(10.0), df(10.0))
f=98.000000 df=20.000000
कल्पना करें कि आपके पास डिलीवरी विकल्प वाला एक रेस्तरां है और आपके पास एक आदेश है जिसे 30 मिनट के भीतर करने की आवश्यकता है। बात यह है कि ग्राहक आमतौर पर परवाह नहीं करते हैं यदि आप कार या नंगे पांव बाइक से अपना भोजन भेजते हैं जब तक आप भोजन को गर्म रखते हैं और बांधते हैं। तो इस मुहावरे को गुमनाम और परिभाषित परिवहन कार्यों के साथ जावास्क्रिप्ट में परिवर्तित करें।
नीचे हमने अपने पहुंचाने के तरीके को परिभाषित किया है जिसे हम एक फ़ंक्शन के नाम से परिभाषित करते हैं:
// ES5
var food = function withBike(kebap, coke) {
return (kebap + coke);
};
यदि हम इस हस्तांतरण को पूरा करने के लिए तीर / लैम्ब्डा कार्यों का उपयोग करेंगे तो क्या होगा:
// ES6
const food = (kebap, coke) => { return kebap + coke };
आप देखते हैं कि ग्राहक के लिए कोई अंतर नहीं है और यह सोचने के लिए कोई समय बर्बाद नहीं है कि भोजन कैसे भेजा जाए। बस भेज दो।
Btw, मैं कोक के साथ कबाब की सिफारिश नहीं करता हूं यही कारण है कि ऊपरी कोड आपको त्रुटियां देंगे। मज़े करो।