سؤال

على سبيل المثال، سأكتب:

x = 2
y = x + 4
print(y)
x = 5
print(y)

وسوف يخرج:

6 (=2+4)
9 (=5+4)

أيضا، هل هناك أي حالات حيث يمكن أن يكون هذا مفيدا في الواقع؟

التوضيح: نعم، Lambdas إلخ. حل هذه المشكلة (كانوا كيف وصلت إلى هذه الفكرة)؛ كنت أتساءل عما إذا كانت هناك لغات محددة حيث كان هذا إفتراضي: لا وظيفة أو lambda الكلمات الرئيسية المطلوبة أو اللازمة.

هل كانت مفيدة؟

المحلول

سيلتقي بك Haskell في منتصف الطريق، لأن كل شيء أساسي هو وظيفة، ولكن المتغيرات مرتبطة فقط مرة واحدة (مما يعني أنه لا يمكنك إعادة تعيين x في نفس النطاق).

من السهل النظر y = x + 4 مهمة متغيرة، ولكن عندما تنظر إلى y = map (+4) [1..] (مما يعني إضافة 4 إلى كل رقم في القائمة اللانهائية من 1 صعودا)، ما هو y الآن؟ هل هي قائمة لا حصر لها، أم أنها وظيفة التي تعود قائمة لا حصر لها؟ (تلميح: إنه الثاني. في هذه الحالة، يمكن أن يكون علاج المتغيرات كوظائف الى ابعد حد مفيد، إن لم يكن ضرورة مطلقة، عند الاستفادة من الكسل.

حقا، في هاسكل، تعريفك y هي وظيفة تقبل أي حجج والعودة x+4, ، أين x هي أيضا وظيفة لا تأخذ أي حجج، ولكنها ترجع القيمة 2.


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

مثال رمز LUA:

x = function() return 2 end
y = function() return x() + 4 end
print(y())
x = function() return 5 end
print(y())
$ lua x.lua 6 9

أو نفس الشيء في Python (التمسك بوظائف الطلب الأول، ولكن كان بإمكاننا استخدام الأعداد الصحيحة العادية للتو x):

x = lambda: 2

y = lambda: x() + 4

print(y())

x = lambda: 5

print(y())
بيثون X.PY $ 6 9

نصائح أخرى

يمكنك استخدام تعبيرات Func في C #

Func<int, int> y = (x) => x + 5;
Console.WriteLine(y(5)); // 10
Console.WriteLine(y(3)); // 8

... أو ...

int x = 0;
Func<int> y = () => x + 5;
x = 5;
Console.WriteLine(y()); // 10
x = 3;
Console.WriteLine(y()); // 8

... إذا كنت ترغب بالفعل في البرنامج في نمط وظيفي، فمن المحتمل أن يكون الخيار الأول أفضل.

  1. يبدو أكثر مثل الأشياء التي رأيتها في فئة الرياضيات.
  2. لا داعي للقلق بشأن الحالة الخارجية.

تحقق من لغات وظيفية مختلفة مثل f #، haskell، و scala. يعامل Scala وظائف ككائنات لها طريقة تطبيق ()، ويمكنك تخزينها في المتغيرات وتمريرها كما يمكنك أي نوع آخر من الكائن. لا أعرف أنه يمكنك طباعة تعريف وظيفة SCALA كود.

تحديث: يبدو أنني أتذكر أن بعض Lisps على الأقل تتيح لك طباعة وظيفة كعود كود (على سبيل المثال، وظيفة الطباعة الجميلة للمخطط).

هذه هي الطريقة التي تعمل بها جداول البيانات.

كما أنها ذات صلة اتصل بالاسم دلالات لتقييم وسيطات الوظيفة. كان لدى Algol 60 ذلك، لكنه لم يمسك، معقد للغاية لتنفيذه.

لغة البرمجة لوكيد هل هذا، على الرغم من أنه يدعو x و y "تدفقات" بدلا من الوظائف. سيتم كتابة البرنامج:

y
  where
    y = x + 4
  end

ثم كنت مدخل:

 x(0): 2
   y = 6
 x(1): 5
   y = 7

بالطبع، واضح (مثل لغات البرمجة الأكثر إثارة للاهتمام) غامضة إلى حد ما، لذلك أنا لست مندهشا أنه لا يوجد أحد آخر وجد ذلك. (أو بحثت عن ذلك)

حاول التحقق من F # هنا و على ويكيبيديا حول لغات البرمجة الوظيفية.

أنا نفسي لم عملت بعد على هذه الأنواع من اللغات منذ أن تركزت على OOP، ولكنها ستكون خوضات قريبا بمجرد خروجها.

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

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

بلدي 2C: أود أن أقول لغة كما تقترح ستكون مربكة للغاية أن أقول أقل. وظائف عموما قيم ص لسبب وجيه. يوضح هذا الرمز (JavaScript) كيف تزيد تطبيق الوظائف كقيم R القابلية (وبالتالي صيانة) N-Fold:

var x = 2;
var y = function() { return x+2; }
alert(y());
x= 5;
alert(y());

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

في SCALA، لديك قيم كسول وتراسات استدعاء الاسم في الوظائف.

def foo(x : => Int) {
    println(x)
    println(x) // x is evaluated again!
}

بطريقة ما، يمكن أن يكون هذا التأثير الذي بحثته عنه.

أعتقد أن اللغات الموجهة نحو الرياضيات مثل اوكتاف, رديئة و ماكسيما إفعل ذلك. قد أكون مخطئا، لكن لا أحد قد ذكرها، لذلك اعتقدت أنني سوف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top