يعد Currying مفهومًا قويًا في البرمجة الوظيفية يقوم بتحويل دالة ذات وسائط متعددة إلى سلسلة من الوظائف، كل منها يأخذ وسيطة واحدة. تسمح هذه التقنية بمزيد من التعليمات البرمجية المعيارية والقابلة لإعادة الاستخدام. في جافا سكريبت، يمكن تنفيذ الكاري بطرق مختلفة. سوف تستكشف هذه المدونة الكاري، وتقدم الأمثلة، وتناقش الطرق المختلفة لتحقيق الكاري n الوسيط.
الكاري هو عملية تحويل دالة تأخذ وسائط متعددة إلى سلسلة من الوظائف التي تأخذ كل منها وسيطة واحدة. على سبيل المثال، يمكن تحويل الدالة f(a, b, c) إلى f(a)(b)(c).
لنبدأ بمثال أساسي لفهم كيفية عمل الكاري.
إليك وظيفة بسيطة تضيف ثلاثة أرقام:
function add(a, b, c) { return a b c; } console.log(add(1, 2, 3)); // Output: 6
شرح: هذه الدالة المضافة تأخذ ثلاث وسيطات a، b، وc، وترجع مجموعها. عندما نستدعي add(1,2,3) فإنه يُرجع 6.
الآن، دعونا نحول هذه الوظيفة إلى إصدار الكاري:
function curryAdd(a) { return function(b) { return function(c) { return a b c; }; }; } console.log(curryAdd(1)(2)(3)); // Output: 6
شرح: تأخذ الدالة curryAdd وسيطة a وترجع دالة تأخذ وسيطة b، والتي بدورها ترجع دالة تأخذ وسيطة c. ترجع الدالة النهائية مجموع a وb وc. عندما نستدعي curryAdd(1)(2)(3)، فإنه يمرر الوسيطات 1 و2 و3 بشكل تسلسلي عبر الدوال المتداخلة، مما يؤدي إلى 6.
توفر وظائف الأسهم في JavaScript طريقة مختصرة لإنشاء وظائف متجانسة.
const curryAddArrow = a => b => c => a b c; console.log(curryAddArrow(1)(2)(3)); // Output: 6
شرح: الدالة curryAddArrow هي دالة سهم تأخذ وسيطة a وترجع دالة سهم أخرى تأخذ b، والتي ترجع دالة سهم أخرى تأخذ وسيطة c. تقوم دالة السهم النهائية بإرجاع مجموع a وb وc. عندما نستدعي curryAddArrow(1)(2)(3)، فإنه يمرر الوسيطات 1 و2 و3 بشكل تسلسلي عبر وظائف الأسهم المتداخلة، مما يؤدي إلى 6.
حالة الاستخدام الشائع للكاري هي وظائف التكوين. على سبيل المثال، تخيل أنك تقوم بإنشاء أداة مساعدة للتسجيل حيث تريد تكوين مستوى التسجيل وتنسيق الرسالة بشكل منفصل.
function logger(level) { return function (message) { console.log(`[${level}] ${message}`); }; } const infoLogger = logger('INFO'); const errorLogger = logger('ERROR'); infoLogger('This is an info message'); errorLogger('This is an error message');
دعونا نفكر في مثال عملي حيث يمكن استخدام الكاري لإنشاء منسق سلسلة. سيسمح لك هذا المنسق بتكوين البادئة واللاحقة بشكل منفصل.
function formatter(prefix) { return function (suffix) { return function (str) { return `${prefix}${str}${suffix}`; }; }; } const htmlFormatter = formatter('')(''); console.log(htmlFormatter('Hello')); // Hello const parensFormatter = formatter('(')(')'); console.log(parensFormatter('123')); // (123)
يشيع استخدام الكاري في مكتبات JavaScript الحديثة مثل Lodash وRamda. على سبيل المثال، في Lodash، يمكنك استخدام طريقة _.curry لإنشاء وظائف الكاري بسهولة.
const _ = require('lodash'); function multiply(a, b, c) { return a * b * c; } const curriedMultiply = _.curry(multiply); console.log(curriedMultiply(2)(3)(4)); // 24 console.log(curriedMultiply(2, 3)(4)); // 24
دعنا نستعرض المثال أدناه عن الكاري باستخدام دالة متكررة تضيف n من الوسائط. سنستخدم الكاري لإنشاء دالة يمكنها قبول أي عدد من الوسائط، واحدة تلو الأخرى، وإضافتها معًا.
function curryAddition(fn) { return function curried(...args) { if (args.length >= fn.length) { return fn(...args); } else { return function(...nextArgs) { return curried(...args, ...nextArgs); }; } }; } // This function sums an array of numbers function add(...nums) { return nums.reduce((acc, num) => acc num, 0); } // Creating a curried version of the addition function const curriedAdd = curryAddition(add); // Function to handle n arguments function curriedAddN(...initialArgs) { function adder(...args) { if (args.length === 0) { return curriedAdd(...initialArgs); } initialArgs.push(...args); return adder; } return adder; } // Examples const addFiveNumbers = curriedAddN(); console.log(addFiveNumbers(1)(2)(3)(4)(5)()); // 15 const addThreeNumbers = curriedAddN(1)(2)(3); console.log(addThreeNumbers()); // 6 const addNumbersInSteps = curriedAddN(1, 2)(3)(4, 5); console.log(addNumbersInSteps()); // 15
يعد Currying تقنية قوية في البرمجة الوظيفية تعمل على تحسين نمطية التعليمات البرمجية وإمكانية إعادة استخدامها. من خلال تحويل الوظائف إلى سلاسل من الوظائف ذات الوسيطة الواحدة، يسمح الكاري بالتطبيق الجزئي والتركيب المرن للوظيفة. سواء أكان الأمر يتعلق بالتكوين، أو تنسيق السلسلة، أو الحسابات المعقدة، فإن الكاري يمكن أن يجعل التعليمات البرمجية الخاصة بك أكثر تعبيرًا وقابلية للتكيف.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3