कल्पना करें कि हम कार्यों की एक श्रृंखला को लागू करना चाहते हैं xयदि और केवल अगर xगैर-अशक्त है:
if (x !== null) x = a(x);
if (x !== null) x = b(x);
if (x !== null) x = c(x);
अब कहते हैं कि हमें ऐसा करने की आवश्यकता है y:
if (y !== null) y = a(y);
if (y !== null) y = b(y);
if (y !== null) y = c(y);
और इसके समान z:
if (z !== null) z = a(z);
if (z !== null) z = b(z);
if (z !== null) z = c(z);
जैसा कि आप एक उचित अमूर्तता के बिना देख सकते हैं, हम बार-बार कोड को दोहराएंगे। ऐसा अमूर्त पहले से मौजूद है: शायद सन्यासी।
हो सकता है कि इकाई दोनों एक मूल्य और एक कम्प्यूटेशनल संदर्भ रखती है:
- मोनाड मूल्य को सुरक्षित रखता है और इस पर कार्य करता है।
- कम्प्यूटेशनल संदर्भ एक फ़ंक्शन लागू करने से पहले एक अशक्त जांच है।
एक भोली कार्यान्वयन इस तरह दिखेगा:
⚠️ यह कार्यान्वयन केवल दृष्टांत प्रयोजन के लिए है! यह नहीं है कि यह कैसे किया जाना चाहिए और कई स्तरों पर गलत है। हालाँकि इससे आपको एक बेहतर विचार मिल सकता है कि मैं किस बारे में बात कर रहा हूँ।
जैसा कि आप देख सकते हैं कि कुछ भी नहीं टूट सकता है:
- हम अपने मूल्य पर कार्यों की एक श्रृंखला लागू करते हैं
- यदि किसी भी बिंदु पर, मान शून्य (या अपरिभाषित) हो जाता है, तो हम अभी कोई फ़ंक्शन लागू नहीं करते हैं।
const abc = obj =>
Maybe
.of(obj)
.map(o => o.a)
.map(o => o.b)
.map(o => o.c)
.value;
const values = [
{},
{a: {}},
{a: {b: {}}},
{a: {b: {c: 42}}}
];
console.log(
values.map(abc)
);
<script>
function Maybe(x) {
this.value = x; //-> container for our value
}
Maybe.of = x => new Maybe(x);
Maybe.prototype.map = function (fn) {
if (this.value == null) { //-> computational context
return this;
}
return Maybe.of(fn(this.value));
};
</script>
परिशिष्ट 1
मैं यह नहीं समझा सकता कि यह कौन से भिक्षु हैं क्योंकि यह इस पद का उद्देश्य नहीं है और वहां के लोग मुझसे बेहतर हैं। हालांकि एरिक इलियट ने हिस्टरी ब्लॉग पोस्ट में कहा कि जावास्क्रिप्ट मोनड्स मेड सिंपल :
अपने कौशल स्तर या श्रेणी सिद्धांत की समझ के बावजूद, मठों का उपयोग करने से आपके कोड के साथ काम करना आसान हो जाता है। भिक्षुओं का लाभ उठाने में विफल रहने से आपका कोड कठिन हो सकता है (जैसे, कॉलबैक नरक, नेस्टेड सशर्त शाखाएं, अधिक वाचालता)।
परिशिष्ट 2
यहां बताया गया है कि शायद मैं आपकी समस्या को हल करूं से इकाईmonetjs
const prop = key => obj => Maybe.fromNull(obj[key]);
const abc = obj =>
Maybe
.fromNull(obj)
.flatMap(prop('a'))
.flatMap(prop('b'))
.flatMap(prop('c'))
.orSome('🌯')
const values = [
{},
{a: {}},
{a: {b: {}}},
{a: {b: {c: 42}}}
];
console.log(
values.map(abc)
);
<script src="https://www.unpkg.com/monet@0.9.0/dist/monet.js"></script>
<script>const {Maybe} = Monet;</script>
try..catchकथन का प्रयास करें । उस ने कहा, एक सरणी जिसमें बेतहाशा विषम तत्व होते हैं, मेरे लिए एक डिजाइन मुद्दा जैसा दिखता है।