मोनैड्स कार्यात्मक प्रोग्रामिंग में एक मौलिक अवधारणा है जो संरचित तरीके से गणना और डेटा परिवर्तनों को संभालने का एक तरीका प्रदान करती है। विभिन्न प्रकार के सन्यासी हैं, प्रत्येक को विशिष्ट समस्याओं को हल करने और विभिन्न प्रकार के डेटा और प्रभावों को संभालने के लिए डिज़ाइन किया गया है।
एक मोनाड एक अमूर्तता है जो लिपटे मूल्यों पर संचालन की श्रृंखला की अनुमति देता है। इसे तीन प्राथमिक गुणों द्वारा परिभाषित किया गया है:
शायद मोनाड का उपयोग वैकल्पिक मानों को संभालने के लिए किया जाता है। यह एक ऐसी गणना का प्रतिनिधित्व करता है जो विफल हो सकती है या शून्य या अपरिभाषित लौट सकती है।
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' }
एथर मोनाड का उपयोग उन गणनाओं को संभालने के लिए किया जाता है जो या तो एक सफलता मान (दाएं) या एक त्रुटि मान (बाएं) लौटा सकते हैं।
class Either { constructor(value, isRight = true) { this.value = value; this.isRight = isRight; } static right(value) { return new Either(value, true); } static left(value) { return new Either(value, false); } map(fn) { return this.isRight ? Either.right(fn(this.value)) : this; } flatMap(fn) { return this.isRight ? fn(this.value) : this; } } // Usage const rightValue = Either.right(5) .map(x => x 1) .flatMap(x => Either.right(x * 2)); console.log(rightValue); // Either { value: 12, isRight: true } const leftValue = Either.left('error') .map(x => x 1) .flatMap(x => Either.right(x * 2)); console.log(leftValue); // Either { value: 'error', isRight: false }
प्रोमिस मोनाड का उपयोग अतुल्यकालिक संगणनाओं को संभालने के लिए किया जाता है।
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); });
लिस्ट मोनाड का उपयोग उन गणनाओं को संभालने के लिए किया जाता है जो मूल्यों की एक सूची तैयार करती हैं।
class List { constructor(values) { this.values = values; } static of(values) { return new List(values); } map(fn) { return List.of(this.values.map(fn)); } flatMap(fn) { return List.of(this.values.flatMap(value => fn(value).values)); } } // Usage const list = List.of([1, 2, 3]) .map(x => x 1) .flatMap(x => List.of([x, x * 2])); console.log(list); // List { values: [ 2, 4, 3, 6, 4, 8 ] }
रीडर मोनाड का उपयोग उन गणनाओं को संभालने के लिए किया जाता है जो कुछ साझा वातावरण या कॉन्फ़िगरेशन पर निर्भर करती हैं।
class Reader { constructor(fn) { this.fn = fn; } static of(value) { return new Reader(() => value); } map(fn) { return new Reader(env => fn(this.fn(env))); } flatMap(fn) { return new Reader(env => fn(this.fn(env)).fn(env)); } run(env) { return this.fn(env); } } // Usage const config = { baseURL: 'https://api.example.com' }; const fetchUser = new Reader(env => `${env.baseURL}/user`); const fetchPosts = new Reader(env => `${env.baseURL}/posts`); const fetchUserAndPosts = fetchUser.flatMap(userURL => fetchPosts.map(postsURL => ({ userURL, postsURL })) ); console.log(fetchUserAndPosts.run(config)); // { userURL: 'https://api.example.com/user', postsURL: 'https://api.example.com/posts' }
राइटर मोनाड का उपयोग उन गणनाओं को संभालने के लिए किया जाता है जो लॉग या अतिरिक्त डेटा के साथ एक मूल्य उत्पन्न करते हैं।
class Writer { constructor(value, log) { this.value = value; this.log = log; } static of(value) { return new Writer(value, ''); } map(fn) { const result = fn(this.value); return new Writer(result.value, this.log result.log); } flatMap(fn) { const result = fn(this.value); return new Writer(result.value, this.log result.log); } tell(log) { return new Writer(this.value, this.log log); } } // Usage const writer = Writer.of(3) .map(value => new Writer(value 1, 'Incremented\n')) .flatMap(value => new Writer(value * 2, 'Doubled\n')); console.log(writer); // Writer { value: 8, log: 'Incremented\nDoubled\n' }
स्टेट मोनाड का उपयोग राज्य को बनाए रखने वाली गणनाओं को संभालने के लिए किया जाता है।
class State { constructor(runState) { this.runState = runState; } static of(value) { return new State(state => [value, state]); } map(fn) { return new State(state => { const [value, newState] = this.runState(state); return [fn(value), newState]; }); } flatMap(fn) { return new State(state => { const [value, newState] = this.runState(state); return fn(value).runState(newState); }); } run(initialState) { return this.runState(initialState); } } // Usage const increment = new State(state => [state 1, state 1]); const result = increment .flatMap(() => increment) .flatMap(() => increment) .run(0); console.log(result); // [3, 3]
मोनैड्स कार्यात्मक प्रोग्रामिंग में गणना और डेटा परिवर्तनों को संभालने के लिए एक संरचित और पूर्वानुमानित तरीका प्रदान करते हैं। प्रत्येक प्रकार का मोनैड एक विशिष्ट उद्देश्य को पूरा करता है, हो सकता है मोनैड के साथ वैकल्पिक मानों को संभालने से लेकर प्रॉमिस मोनैड के साथ अतुल्यकालिक संचालन को प्रबंधित करने तक।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3