lambda - ناطق - معنى كلمة عنوان بالانجليزي




ما هي امدا(وظيفة)؟ (13)

بالنسبة لشخص بدون خلفية comp-sci ، ما هو لامدا في عالم علوم الكمبيوتر؟

سأوضح ذلك خطوة بخطوة في رموز الثعبان البسيط والقابل للقراءة.

باختصار ، lambda هو مجرد وظيفة مجهولة ومضمنة.

دعونا نبدأ من المهمة لفهم lambdas باعتباره طالبة مع خلفية الحساب الأساسي.

مخطط التفويض هو "الاسم = القيمة" ، انظر:

In [1]: x = 1
   ...: y = 'value'
In [2]: x
Out[2]: 1
In [3]: y
Out[3]: 'value'

"x" و "y" هي أسماء و 1 ، و "value" هي قيم. جرب وظيفة في الرياضيات

In [4]: m = n**2 + 2*n + 1
NameError: name 'n' is not defined

تقارير الخطأ ،
لا يمكنك كتابة رياضيات مباشرة كرمز ، يجب تعريف "n" أو تعيينها لقيمة.

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 نوع منها في بيثون 7. بيانات بسيطة - بيثون 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

Tada ، حللها ، 'm' هو الاسم ، 'n ** 2 + 2 * n + 1' قيمة. : هو متغير من '='.
العثور عليه ، إذا كان فقط لفهم ، يبدأ كل شيء من المهمة وكل شيء هو الاحالة.

نعود الآن إلى lambda ، لدينا وظيفة تسمى "m"

محاولة:

In [28]: m = m(3)
In [29]: m
Out[29]: 16

هناك اسمان 'm' هنا ، الدالة 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

انها تسمى "وظيفة مجهولة"

فى الختام،

  1. lambda في وظيفة مضمنة والتي تمكنك من كتابة وظيفة في خط واحد مستقيم كما يفعل في الرياضيات
  2. lambda هو مجهول

أتمنى أن يساعدك هذا.

بالنسبة لشخص بدون خلفية comp-sci ، ما هو لامدا في عالم علوم الكمبيوتر؟


Brian أستخدم lambdas طوال الوقت في C # ، في مشغلي LINQ وغير LINQ. مثال:

string[] GetCustomerNames(IEnumerable<Customer> customers)
 { return customers.Select(c=>c.Name);
 }

قبل C # ، استخدمت الدوال المجهولة في جافا سكريبت لاستدعاءات الوظائف AJAX ، قبل صياغة مصطلح Ajax حتى:

getXmlFromServer(function(result) {/*success*/}, function(error){/*fail*/});

لكن الشيء المثير للاهتمام مع بناء لامدا C # هو ، على الرغم من ذلك ، هو أنه من تلقاء نفسها لا يمكن استنتاج نوعهم (أي ، لا يمكنك كتابة var foo = (x، y) => x * y) ولكن اعتمادًا على نوع عند تعيينها ، سيتم تصنيفها كمفوضين أو أشجار تجريبية مجردة تمثل التعبير (وهو الطريقة التي يقوم بها مصمموا كائنات LINQ بالسحر "المتكامل مع اللغة").

يمكن أيضًا تمرير Lambdas في LISP إلى مشغل اقتباس ثم اجتيازها كقائمة من القوائم. يتم إجراء بعض وحدات الماكرو قوية بهذه الطريقة.


إن lambda calculus هي نظرية رياضية متسقة للإحلال. في الرياضيات المدرسية ، يرى المرء على سبيل المثال x+y=5 مقترنًا بـ x−y=1 . إلى جانب طرق معالجة المعادلات الفردية ، يمكن أيضًا وضع المعلومات من هاتين المعادلتين معًا ، شريطة أن تتم عمليات استبدال التبادل المنطقي. يدوّن حساب لامبدا الطريقة الصحيحة للقيام بهذه البدائل.

وبالنظر إلى أن y = x−1 هو إعادة ترتيب صحيح للمعادلة الثانية ، فإن هذا يعني أن الدالة λ y = x−1 تعني استبدال الرموز x−1 للرمز 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

http://imgur.com/a/XBHub


إن lambda هو نوع من الوظائف ، مضمن في السطر. جنبا إلى جنب مع lambda أنت أيضا عادة ما يكون نوعا من نوع متغير يمكن أن يحمل إشارة إلى وظيفة ، لامدا أو غير ذلك.

على سبيل المثال ، إليك جزء من رمز C # لا يستخدم lambda:

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 ، حصلنا على lambdas مما يجعل الشفرة أقصر:

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);
}

اسم "lambda" هو مجرد قطعة أثرية تاريخية. كل ما نتحدث عنه هو تعبير قيمه هي وظيفة.

مثال بسيط (باستخدام Scala للخط التالي) هو:

args.foreach(arg => println(arg))

حيث تعد الوسيطة إلى أسلوب foreach تعبيرًا لدالة مجهولة. الخط أعلاه هو أكثر أو أقل مثل كتابة شيء مثل هذا (ليس رمزًا حقيقيًا ، ولكن ستحصل على الفكرة):

void printThat(Object that) {
  println(that)
}
...
args.foreach(printThat)

باستثناء أنك لست بحاجة إلى أن تهتم بما يلي:

  1. الإعلان عن وظيفة في مكان آخر (والاضطرار إلى البحث عنه عند إعادة النظر في التعليمات البرمجية لاحقاً).
  2. تسمية شيء تستخدمه مرة واحدة فقط.

بمجرد أن تعتاد على عمل القيم ، فإن الاستغناء عنهم يبدو سخيلاً كأنه مطلوب من تسمية كل تعبير ، مثل:

int tempVar = 2 * a + b
...
println(tempVar)

بدلاً من مجرد كتابة التعبير الذي تريده:

println(2 * a + b)

يختلف الرمز الدقيق من لغة إلى أخرى ؛ اليونانية ليست دائما مطلوبة! ؛-)


حصلت عليه ايضا. لقد حاولت ذلك في 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)؛

ستقوم هذه الطريقة بتكرار صفيف وتقوم بإجراء - في حالة الطباعة إلى وحدة التحكم. الآن أنا أيضا الحصول على سبب labmdas قوية.


في Javascript ، على سبيل المثال ، يتم التعامل مع الدالات على أنها نفس النوع المختلط مثل كل شيء آخر ( 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 هو جزء من التعليمات البرمجية (بيان أو تعبير أو مجموعة منها) التي تأخذ بعض الوسائط من مصدر خارجي. يجب ألا تكون دائمًا مهمة مجهولة - لدينا العديد من الطرق لتنفيذها.

لدينا فصل واضح بين التعبيرات والبيانات والوظائف التي لا يمتلكها علماء الرياضيات.

كما تختلف كلمة "وظيفة" في البرمجة - لدينا "وظيفة هي سلسلة من الخطوات للقيام" (من "أداء" اللاتينية). في الرياضيات هو شيء عن العلاقة بين المتغيرات.

تحاول اللغات الوظيفية أن تكون مشابهة لصيغ الرياضيات قدر الإمكان ، وكلماتها تعني تقريبًا نفس. ولكن في لغات البرمجة الأخرى ، يكون الأمر مختلفًا.


لامدا يأتي من لامبالا حساب التفاضل والتكامل ويشير إلى وظائف مجهولة في البرمجة.

لماذا هذا رائع؟ انها تسمح لك بكتابة وظائف رمي بعيدا بعيدا دون تسمية لهم. كما يوفر طريقة لطيفة لكتابة الإغلاق. مع هذه القوة يمكنك القيام بأشياء من هذا القبيل.

الثعبان

def adder(x):
    return lambda y: x + y
add5 = adder(5)
add5(1)
6

كما ترى من مقتطف بايثون ، تأخذ الدالة adder في الوسيطة x ، وترجع دالة مجهولة ، أو lambda ، التي تأخذ حجة أخرى y. تسمح لك هذه الوظيفة المجهولة بإنشاء وظائف من الوظائف. هذا مثال بسيط ، ولكن يجب أن ينقل السلطة lambdas والإغلاق لها.

أمثلة في لغات أخرى

جافا سكريبت

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

C # 3.5 أو أعلى

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

PHP

$a = 1;
$b = 2;

$lambda = function () use (&$a, &$b) {
    echo $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

لدي مشكلة في التفاف رأسي حول تعبيرات لامدا لأنني أعمل في Visual FoxPro ، الذي لديه استبدال ماكرو والدالة ExecScript {} و Evaluate () ، التي يبدو أنها تخدم نفس الغرض.

? Calculator(10, 23, "a + b")
? Calculator(10, 23, "a - b");

FUNCTION Calculator(a, b, op)
RETURN Evaluate(op)

فائدة واحدة محددة لاستخدام lambdas الرسمي هو (أفترض) التحقق من وقت التحويل البرمجي: Fox لن يعرف ما إذا كنت تكتب سلسلة النص أعلاه حتى يحاول تشغيلها.

هذا مفيد أيضًا للشفرة المستندة إلى البيانات: يمكنك تخزين إجراءات كاملة في حقول المذكرة في قاعدة البيانات ثم تقييمها فقط في وقت التشغيل. هذا يتيح لك تعديل جزء من التطبيق دون أن يكون لديك حق الوصول إلى المصدر. (ولكن هذا موضوع آخر تمامًا).


مثال على لامدا في روبي هو كما يلي:

hello = lambda do
    puts('Hello')
    puts('I am inside a proc')
end

hello.call

سيولد الناتج التالي:

Hello
I am inside a proc

يتم الإجابة على السؤال بشكل كبير ، لذا لن أحاول إضافة المزيد حول هذا الموضوع.

بكلمات بسيطة غير رسمية لشخص لا يعرف سوى القليل جدا أو لا شيء على الرياضيات أو البرمجة ، أود أن أشرح ذلك على أنه "آلة" صغيرة أو "مربع" صغير يأخذ بعض المدخلات ، ويجعل بعض العمل وينتج بعض المخرجات ، ليس له اسم محدد لكننا نعرف من أين و بهذه المعرفة نستخدمها.

من الناحية العملية ، بالنسبة لشخص يعرف ما هي الوظيفة ، أود أن أخبرهم أنها دالة ليس لها اسم ، وعادة ما توضع إلى نقطة في الذاكرة يمكن استخدامها فقط من خلال الإشارة إلى تلك الذاكرة (عادة عن طريق استخدام متغير - إذا سمعوا عن مفهوم مؤشرات الدالة ، سأستخدمها كمفهوم مماثل) - هذه الإجابة تغطي الأساسيات الجميلة (لا يوجد ذكر للإغلاق الخ) ولكن يمكن للمرء أن يحصل على هذه النقطة بسهولة.






theory