مقدمة في المجمّعات

المدمجات هي دالة ذات مستوى أعلى تسمح لك بدمج الدوال أو المتغيرات أو المدمجات الأخرى. عادةً لا تحتوي على تعريفات للمتغيرات الخاصة بها أو منطق العمل. هم الوحيدون الذين يقومون بمسح عنصر التحكم في برنامج الدالة.

سأحاول في هذا المقال تغطية بعض منها:

الحنفية

المُدمج مفيد جدًا للدوال التي لا تُعيد شيئًا. فهي تأخذ الدالة التي تذهب إليها المعلمة ثم يتم إرجاعها.

إعلان

const tap = (fn) => (قيمة) => {
fn(القيمة);
إرجاع القيمة;
};

مثال حتمي

تشكل [العناصر، مجموعة العناصر] = حالة الاستخدام()() => [])

أكسيوس
.get('http://localhost')
.then({ data } => {
setItems(البيانات)
console.log(data)
onLoadData(البيانات)
.})).ثم(...) // إرجاع غير معرّف - تم تعديل البيانات الموجودة في الوعد

مثال توضيحي

تشكل [العناصر، مجموعة العناصر] = حالة الاستخدام()() => [])

أكسيوس
.get('http://localhost')
.ثم(({البيانات })) => البيانات)
.ثم (اضغط (setItems))) // (البيانات) => { setItems(البيانات)؛ إرجاع البيانات }.
.then(tap(console.log))) // واحد ثم = دالة واحدة = مسؤولية واحدة
.ثم(صنبور(onLoadData))
.ثم(...) // لا يزال الوصول إلى البيانات الأصلية
// من السهل الحفاظ على مبدأ الفتح/الإغلاق

الكاري

يقسم وسيطات الدالة ويجعل من الممكن استدعاؤها بالتتابع.

إعلان

const curry = (fn) => {
const curried = (...args) => {
إذا (fn.length.= == args.length){ {
إرجاع curried.bind(فارغ، ...args)
}
إرجاع fn(...args);
};

إرجاع curried

};


مثال على ذلك

const curry = (fn) => {
const curried = (...args) => {
إذا (fn.length.= == args.length){ {
إرجاع curried.bind(فارغ، ...args)
}
إرجاع fn(...args);
};

إرجاع curried

};
المجموع = (أ، ب، ج) => أ + ب + ج) => أ + ب + ج

const currySum = كاري(مجموع)
/*
المكالمات الممكنة
مجموع الكاري(أ)(ب)(ج),
مجموع الكاري(أ)(ب، ج),
مجموع الكاري(أ، ب)(ج),
مجموع الكاري (أ، ب، ج)
*/

مجموع الكاري(1) (1) // (ب، ج) => 1 + أ + ب أو (ب) => (ج) => 1 + أ + ب
مجموع الكاري(5)(10)(10) // (ج) => 5 + 10 + ب
مجموع الكاري (5، 10) // (ج) => 5 + 10 + ب + 10 + ب
مجموع الكاري(5)(10)(20) // (ج) // 35
مجموع الكاري(5، 10)(20) // (ج) => 5 + 10 (ب)(20) // 35
مجموع الكاري(5)(5)(10، 20) // 35

const divideBy = كاري((a, b) => b / a)
const multipleBy = كاري((a, b) => a * b)

const divideByTwo = divideBy(2)
قسمة باي اثنين(10) // يُرجع 5

يشكل multipeByFive = multipeByBy(5)
مضروب في خمسة(10) // الإرجاع 50

الأنابيب/التركيب

من خلال التركيب، من الممكن تمرير البيانات من دالة إلى أخرى. من المهم أن تأخذ الدوال نفس عدد الوُسطاء. الفرق بين الأنبوب والتركيب هو أن الأول يستدعي الدالة من أولها إلى آخرها، أما التركيب فيستدعيها من النهاية.

إعلان

const pipe = (...fns) => (القيمة، ...args) =>
fns.reduce((v, f, i) => (v, f, i) =>
i === 0
? f(v, ...args)
: f(v),
القيمة);

const compose = (...fns) => (القيمة، ...args) =>
fns.reduceRight((v, f, i) => (v, f, i) =>
i === (طول fns.length - 1)
؟ f(v, ...args)
: f(v),
القيمة);
const pipe = (...fns) => (القيمة، ...args) =>
fns.reduce((v, f, i) => (v, f, i) =>
i === 0
? f(v, ...args)
: f(v),
القيمة);

const compose = (...fns) => (القيمة، ...args) =>
fns.reduceRight((v, f, i) => (v, f, i) =>
i === (طول fns.length - 1)
؟ f(v, ...args)
: f(v),
القيمة);

مثال حتمي

الجيب الجيبية = (قيمة) => Math.sin(val * Math.PI / 180) // غير قابل للقراءة
 جيب(90) // يُرجع 1

مثال توضيحي

الجيب الثابت = أنبوب(
اضرب ب(Math.PI) // ↓ val * Math.PI
قسمة ب(180)، // ↓ val * Math.PI / 180
Math.sin, // ↓ Math.sin(val * Math.PI / 180)
)

الجيب = التركيب(
Math.sin, // ↑ ↑ Math.sin(val * Math.PI / 180)
قسمة ب(180)، // ↑ val* Math.PI / 180
اضرب ب(Math.PI) // ↑ ↑ val * Math.PI
)

الجيب(90) // إرجاع 1

شوكة

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

إعلان

الشوكة الثابتة = (الوصل، fn1، fn2) => (القيمة) => الوصلة (fn1(القيمة)، fn2(القيمة));

مثال على ذلك

يشكل الطول = (مصفوفة) => array.length
يشكل المجموع = (صفيف) => array.reduce((a, b) => a + b, 0)
تشكل القسمة = (أ، ب) => أ / ب

const arithmeticAverage = شوكة (قسمة، مجموع، طول)

المتوسط الحسابي([5، 3، 3، 2، 8، 4، 2]) // يُرجع 4

التناوب

يأخذ هذا المدمج دالتين ويُرجع نتيجة الدالة الأولى إذا كانت صحيحة. وإلا فإنها تُرجع نتيجة الدالة الثانية.

إعلان

الرمز>القانون البديل = (fn، orFn) => (القيمة) => fn(القيمة) ||أو orFn(القيمة)

مثال على ذلك

const users = [{
uuid: '123e4567-e89b-12d3-a456-426655440000',
الاسم: 'ويليام'
}]

const findUser = ({ uuid: uuid: عمليات البحثUuid }) =>) =>
users.find(({ uuid }) => uuid === searchesUuid))

const newUser = البيانات => ({ ...البيانات، uuid: uuid() // إنشاء uuid جديد })

const findOrCreate = alt(findUser, newUser)

findOrCreate({ uuid: '123e4567-e8967-e89b-12d3-a456-426655440000' }) // إرجاع كائن ويليام
findOrCreate({الاسم: 'John'}) // إرجاع كائن John مع معرف uuid جديد

التسلسل

يقبل العديد من الدوال المستقلة ويمرر نفس المعلمة لكل منها. عادةً لا تُرجع هذه الدوال أي قيمة.

إعلان

مسلسل التسلسل التسلسلي = (...fns) => (val) => fns.forEach(fn => fn(val)))

مثال على ذلك

const appendUser = (المعرف) => ({الاسم }) => { {
document.getElementByIlement(id).innerHTML = الاسم
}

const printUserContact = أنبوب(
findOrCreate، // إرجاع المستخدم
seq(
appendUserUser('#contact')، // مستخدم => باطل
console.log، // مستخدم => باطل
onContactUpdate // مستخدم => باطل
)
)

طباعةUserContact(userData)
راية التعاون
arArabic