هل "تطبيق الوظيفة الجزئية" تسمية خاطئة في سياق جافا سكريبت؟

StackOverflow https://stackoverflow.com/questions/92984

  •  01-07-2019
  •  | 
  •  

سؤال

كنت أنا وصديق لي نتناقش بشأن تطبيق الكاري والوظيفة الجزئية في جافا سكريبت، وتوصلنا إلى استنتاجات مختلفة تمامًا حول ما إذا كان أي منهما قابلاً للتحقيق.لقد توصلت إلى هذا التنفيذ لـ Function.prototype.curry, والذي كان أساس نقاشنا:

Function.prototype.curry = function() {
    if (!arguments.length) return this;

    var args = Array.prototype.slice.apply(arguments);
    var mmm_curry = this, args;

    return function() {
        var inner_args = Array.prototype.slice.apply(arguments);
        return mmm_curry.apply(this, args.concat(inner_args));
    }

}

والذي يستخدم على النحو التالي:

var vindaloo = function(a, b) {
    return (a + b);
}

var karahi = vindaloo.curry(1);
var masala = karahi(2);
var gulai = karahi(3);

print(masala);
print(other);

الإخراج كما يلي في Spidermonkey:

$ js curry.js
3
4

وكان رأيه أنه منذ جافا سكريبت function البدائي لا يدعم أصلاً "تطبيق الوظيفة الجزئية"، فمن الخطأ تمامًا الإشارة إلى الوظيفة المرتبطة بالمتغير karahi كما تم تطبيقه جزئيا.وكانت حجته أنه عندما vindaloo يتم تنفيذ الوظيفة، ويتم تطبيق الوظيفة نفسها بالكامل ويتم إرجاع الإغلاق، وليس "وظيفة مطبقة جزئيًا".

الآن، رأيي هو أنه على الرغم من أن Javascript نفسها لا توفر دعمًا للتطبيق الجزئي في برامجها. function البدائيات (على عكس ML أو Haskell)، هذا لا يعني أنه لا يمكنك إنشاء وظيفة ذات ترتيب أعلى للغة قادرة على تغليف مفهوم الوظيفة المطبقة جزئيًا.أيضًا، على الرغم من كونها "مطبقة"، إلا أن نطاق الوظيفة لا يزال مرتبطًا بالإغلاق الذي ترجعه مما يجعلها تظل "مطبقة جزئيًا".

ايهم صحيح؟

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

المحلول

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

vindaloo.curry = function(a) {
    return function(b) {
        return a + b;
    };
};

IIUC، لا تزال هذه وظيفة غير مطبقة جزئيًا.لكنه أقرب.ستبدو الوظيفة الحقيقية المطبقة جزئيًا هكذا إذا كان بإمكانك فحص الكود:

function karahi(b) {
    return 1 + b;
};

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

ومع ذلك، فإن الحل الخاص بك هو تطبيق عملي جيد للمفهوم على JavaScript، لذا فإن التحدث عمليًا يحقق الهدف، حتى لو لم يكن دقيقًا من الناحية الفنية.

نصائح أخرى

أعتقد أنه من الجيد تمامًا التحدث عن تطبيق الوظيفة الجزئية في JavaScript - إذا كان يعمل مثل التطبيق الجزئي ، فيجب أن يكون واحدًا.وإلا كيف يمكنك تسميتها؟

كيف الخاص بك كاري الوظيفة تحقق هدفه هو مجرد تفاصيل التنفيذ.بطريقة مماثلة ، يمكن أن يكون لدينا تطبيق جزئي في مواصفات ECMASCRIPT ، ولكن عندما تنفذها IE كما فعلت ، لن يكون لديك أي وسيلة لمعرفة ذلك.

التفاصيل الفنية لا تهمني - إذا ظلت الدلالات كما هي، ولجميع المقاصد والأغراض، تعمل الوظيفة كما لو كانت بالفعل وظيفة مطبقة جزئيًا، فمن يهتم؟

لقد اعتدت أن أكون أكاديميًا فيما يتعلق بالأشياء، لكن القلق بشأن مثل هذه التفاصيل لا يؤدي إلى إنجاز عمل حقيقي في النهاية.

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

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

يحرر:ومع ذلك، فأنا أتفق مع تقييمك.

كان رأيه أنه نظرًا لأن وظيفة Javascript البدائية لا تدعم أصلاً "تطبيق الوظيفة الجزئية"

يمكنك القيام بالكاري في ES6 بشكل أنيق جدًا:

> const add = a => b => a + b
> const add10 = add(10)
> [1,2,3].map(add10)
[ 11, 12, 13 ]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top