تعد Monads و functors مفاهيم متقدمة في البرمجة الوظيفية التي توفر تجريدات قوية للتعامل مع تحويلات البيانات والآثار الجانبية والتكوين. على الرغم من أنها تنشأ من نظرية الفئات في الرياضيات، إلا أن لها تطبيقات عملية في لغات البرمجة مثل جافا سكريبت.
العامل هو نوع بيانات ينفذ طريقة خريطة، والتي تطبق دالة على القيمة داخل العامل وترجع عاملاً جديدًا بالقيمة المحولة. في الأساس، تسمح لك الوظائف بتطبيق دالة على قيمة ملتفة دون تغيير بنية الحاوية.
class Box { constructor(value) { this.value = value; } map(fn) { return new Box(fn(this.value)); } } // Usage const box = new Box(2); const result = box.map(x => x 3).map(x => x * 2); console.log(result); // Box { value: 10 }
في هذا المثال، Box هو عامل. يطبق أسلوب الخريطة الدالة fn على القيمة الموجودة داخل الصندوق ويعيد صندوقًا جديدًا بالقيمة المحولة.
الموناد هو نوع من الوظائف التي تنفذ طريقتين إضافيتين: of (أو العودة في بعض اللغات) وflatMap (المعروف أيضًا باسم الربط أو السلسلة). توفر الموناد طريقة لتسلسل العمليات على القيمة المضمنة مع الحفاظ على سياق الموناد.
class Box { constructor(value) { this.value = value; } static of(value) { return new Box(value); } map(fn) { return Box.of(fn(this.value)); } flatMap(fn) { return fn(this.value); } } // Usage const box = Box.of(2); const result = box .flatMap(x => Box.of(x 3)) .flatMap(x => Box.of(x * 2)); console.log(result); // Box { value: 10 }
في هذا المثال، يعتبر Box دالة وظيفية وأحادية. تقوم طريقة of بتغليف قيمة في صندوق، وتقوم طريقة flatMap بتطبيق دالة على القيمة المضمنة وإرجاع الموناد الناتج.
المونادات والمؤثرون ليسوا مجرد بنيات نظرية؛ لديهم تطبيقات عملية في برمجة العالم الحقيقي. دعونا نستكشف بعض حالات الاستخدام الشائعة.
يتم استخدام ربما monad للتعامل مع القيم الاختيارية، وتجنب القيم الفارغة أو غير المحددة وتوفير طريقة آمنة للعمليات المتسلسلة.
class Maybe { constructor(value) { this.value = value; } static of(value) { return new Maybe(value); } isNothing() { return this.value === null || this.value === undefined; } map(fn) { return this.isNothing() ? this : Maybe.of(fn(this.value)); } flatMap(fn) { return this.isNothing() ? this : fn(this.value); } } // Usage const maybeValue = Maybe.of('hello') .map(str => str.toUpperCase()) .flatMap(str => Maybe.of(`${str} WORLD`)); console.log(maybeValue); // Maybe { value: 'HELLO WORLD' }
في هذا المثال، ربما يتعامل الموناد بأمان مع القيمة الاختيارية، مما يسمح بالتحويلات فقط إذا لم تكن القيمة فارغة أو غير محددة.
الوعود في JavaScript هي وحدات أحادية تتعامل مع العمليات غير المتزامنة، وتوفر طريقة لتسلسل العمليات ومعالجة الأخطاء.
const fetchData = url => { return new Promise((resolve, reject) => { setTimeout(() => { resolve(`Data from ${url}`); }, 1000); }); }; // Usage fetchData('https://api.example.com') .then(data => { console.log(data); // 'Data from https://api.example.com' return fetchData('https://api.example.com/2'); }) .then(data => { console.log(data); // 'Data from https://api.example.com/2' }) .catch(error => { console.error(error); });
تتيح لك الوعود التعامل مع العمليات غير المتزامنة بطريقة نظيفة وقابلة للتركيب، وتسلسل العمليات ومعالجة الأخطاء بأمان.
تعتبر Monads و functors تجريدات قوية في البرمجة الوظيفية التي تمكنك من العمل مع تحويلات البيانات، والآثار الجانبية، والتركيب بطريقة أكثر تنظيماً وقابلية للتنبؤ.
على الرغم من أن الأسس الرياضية للأحاديات والوظائف يمكن أن تكون معقدة، إلا أن تطبيقاتها العملية ذات قيمة عالية في برمجة العالم الحقيقي. سواء كنت تتعامل مع قيم اختيارية باستخدام ربما monad أو تدير عمليات غير متزامنة باستخدام Promises، فإن تقنيات البرمجة الوظيفية هذه يمكن أن تساعدك في إنشاء تطبيقات أكثر قوة وموثوقية.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3