Currying يحول دالة تأخذ N من المعاملات إلى سلسلة من N دوال تأخذ كل منها معامل واحد. Partial application يثبت بعض المعاملات الآن ويعيد دالة في انتظار الباقي.
js
= () => a + b + c;
= a => a + b + c;
()()();
add10 = ();
()();
Currying يحول دالة تأخذ N من المعاملات إلى سلسلة من N دوال تأخذ كل منها معامل واحد. Partial application يثبت بعض المعاملات الآن ويعيد دالة في انتظار الباقي.
= () => a + b + c;
= a => a + b + c;
()()();
add10 = ();
()();
كل خطوة تستخدم closure لتذكر المعاملات السابقة حتى يتم توفير جميعها.
const log = level => message => console.log(`[${level}] ${message}`);
const error = log("ERROR"); // reusable, pre-configured logger
const info = log("INFO");
error("disk full"); // [ERROR] disk full
بدلاً من تكرار المستوى في كل مكان، تقوم بإنشاء دوال مكونة مرة واحدة. هذا يتألق في functional pipelines ومعالجات الأحداث:
const onChange = field => e => setForm(f => ({ ...f, [field]: e.target.value }));
<input onChange={onChange("email")} /> // a handler specialized to "email"
المكتبات (Ramda، lodash curry) تقوم بـ auto-curry لأي دالة حتى تتمكن من توفير المعاملات في مجموعات مرنة.
يمكّن Currying من function composition نظيفة وcallbacks مكونة قابلة لإعادة الاستخدام وpoint-free style.
إنه شائع في الأكواد البرمجية الوظيفية وموضوع متكرر في المقابلات لاختبار فهم closures.