javascript - مميزات - هل جافا سكريبت لغة برمجة وظيفية؟




مميزات الجافا سكريبت (9)

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


petraszd أقوم بإعادة كتابة التعليمات البرمجية الخاصة بك قليلاً للحصول على "جديد" للمشغل:

   
   function ffor(a, b, f){
     function it(i){
       if(i > b)return
       f(i)
       it(i+1)
     }
     it(a)
   }

   print("----" + new Date()+"----")

   var funcs = []
   ffor(0, 9, function(i){
     funcs.push(function(){return i})
   })

   ffor(0, 9, function(i){
     print(funcs[i]())
   })

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

السؤال ذات الصلة حول تحسين الذيل الذيل في JS

سكرتير خاص نشر هنا cuz لديك مشكلة مع تنسيق التعليمات البرمجية أثناء نشر كتعليق


أود أن أقول إنها لغة متعددة النماذج.

تحرير: إنه متعدد النماذج ويتضمن بنيات وظيفية.


إن مصطلح "البرمجة الوظيفية" مفرط للغاية في هذه الأيام. هناك نوعان من المعاني السائدة:

  1. لديه وظائف من الدرجة الأولى
    • جافا سكريبت هو هذا!
  2. يعتمد على الوظائف المستخدمة في حساب lambda ، مع التركيز على تجنب الحالة المستمرة القابلة للتغيير (غالباً ما يتم استبدالها بمعلمات تم تمريرها إلى وظائف)
    • كما هو مكتوب بشكل شائع ، فإن Javascript ليس عن بعد!

اختيار المعنى الخاص بك ومن ثم السؤال هو المسؤول.


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


تكرار إجابتي على سؤال مماثل ،

لا يوجد تعريف مقبول للغة البرمجة الوظيفية.

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

إذا كنت تفكر أيضًا في عوامل مثل دعم ثبات النظام ، وأنواع البيانات الجبرية ، ومطابقة النموذج ، والتطبيق الجزئي ، وما إلى ذلك ، فإن JavaScript * ليست * لغة وظيفية.

أشجعك على قراءة مشاركات المدونات التالية ذات الصلة (وكذلك التعليقات أدناه):


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


في Javascript ، يمكنك فعل شيء كهذا !!

// Data
var fruits = [
    { name: 'apple',  price: 5 }, 
    { name: 'orange', price: 10 }, 
    { name: 'lemon',  price: 15 }
]

// Request Data from magicURL
request('magicURL')
    .then(selectKeyOf('price'))
    .then(priceMethod('sum'))
    .then((result)=>{
        console.log(result) // 30
    })

لقد قدمت صفحة github من أجل عرض هذا المفهوم ، ويمكنك استنساخ / عرض التنفيذ


كما نعلم أن لغة البرمجة الوظيفية لا تسمح بتغيير أو تغيير عناصر (حالة) الوظائف ولكن في جافا سكريبت مسموح بها بهذا المعنى فهي ليست لغة برمجة وظيفية ، على الرغم من أنها تعامل الوظيفة كمواطنين من الدرجة الأولى.


ما أكره حقًا في javascript (إذا حاولت أن تنظر إليه بلغة FP) هو:

function getTenFunctionsBad() {
  var result = [];
  for (var i = 0; i < 10; ++i) {
    result.push(function () {
      return i;
    });
  }
  return result;
}

function getTenFunctions() {
  var result = [];
  for (var i = 0; i < 10; ++i) {
    result.push((function (i) {
      return function () {
        return i;
      }
    })(i));
  }
  return result;
}

var functionsBad = getTenFunctionsBad();
var functions = getTenFunctions()
for (var i = 0; i < 10; ++i) {
  // using rhino print
  print(functionsBad[i]() + ', ' + functions[i]());
}

// Output:
//   10, 0
//   10, 1
//   10, 2
//   10, 3
//   10, 4
//   10, 5
//   10, 6
//   10, 7
//   10, 8
//   10, 9

تحتاج إلى فهم بيئة مكدس JS (لا أعرف إذا كان هو المصطلح المناسب) لفهم مثل هذا السلوك.

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

(define (make-ten-functions)
  (define (iter i)
    (cond ((> i 9) '())
          (else (cons (lambda () i) (iter (+ i 1))))))
  (iter 0))

(for-each (lambda (f)
            (display (f))
            (newline)) (make-ten-functions))




terminology