क्या यह 'अशक्त' और 'शायद' दोनों की अवधारणा को समझ सकता है?


11

C # में एक वेब API के लिए क्लाइंट बनाते समय , मैं nullएक मूल्य के रूप में एक समस्या में भाग गया, जहाँ यह दो अलग-अलग चीजों का प्रतिनिधित्व करेगा:

  • कुछ नहीं , उदाहरण के लिए एक fooया नहीं हो सकता हैbar
  • अज्ञात : डिफ़ॉल्ट रूप से एपीआई प्रतिक्रिया में केवल संपत्तियों का सबसेट शामिल होता है, आपको यह इंगित करना होगा कि आपको कौन से अतिरिक्त गुण चाहिए। इसलिए अज्ञात का अर्थ है कि संपत्ति एपीआई से अनुरोध नहीं की गई थी।

कुछ खोज के बाद मुझे पता चला कि शायद (या विकल्प) प्रकार के बारे में, यह कैसे कार्यात्मक भाषाओं में उपयोग किया जाता है और यह कैसे उपयोगकर्ता को मूल्य के संभावित अभाव के बारे में सोचने के लिए मजबूर करके समस्याओं को "हल" करता है। हालाँकि, मैंने जिन संसाधनों का सामना किया, उनमें से शायद नल के साथ बदलने की बात की । मुझे तीन-मूल्यवान तर्क के कुछ उल्लेख मिले , लेकिन मैं इसे पूरी तरह से समझ नहीं पाया और अधिकांश बार इसका उल्लेख "यह एक बुरी बात है" के संदर्भ में था।

मैं अब सोच रहा था कि यह समझ में आता है कि अशक्त और शायद दोनों की अवधारणा , क्रमशः अज्ञात और कुछ भी नहीं है। क्या यह तीन-मूल्यवान तर्क है जिसके बारे में मैंने पढ़ा है, या इसका दूसरा नाम है? या एक शायद में घोंसला बनाने का इरादा तरीका है?


9
यह करने के लिए संन्यास नहीं करता है null। यह एक अच्छी तरह से टूटा हुआ विचार है।
बाउर

7
एक शायद-शायद-फू न बनाएं जिसमें एक अलग-अलग शब्दार्थ हैं जो शायद-फू से अलग हैं। हो सकता है कि एक है इकाई , और इकाई कानूनों में से एक यह है कि M M xऔर M xएक ही अर्थ विज्ञान होना चाहिए।
एरिक लिपर्ट

2
आप विज़ुअल बेसिक के शुरुआती संस्करणों के डिज़ाइन को देखने पर विचार कर सकते हैं, जिसमें कुछ भी नहीं था (बिना किसी ऑब्जेक्ट के संदर्भ), नल (डेटाबेस शून्य शब्दार्थ), खाली (एक वेरिएबल आरंभीकृत नहीं), और मिसिंग (एक वैकल्पिक पैरामीटर पारित नहीं किया गया था)। यह डिजाइन जटिल और कई मायनों में असंगत था, लेकिन एक कारण है कि उन अवधारणाओं को एक दूसरे के साथ भ्रमित नहीं किया गया था।
एरिक लिपर्ट

3
Maybe aa+1Maybe Maybe aa+1+1UserInput a

12
@EricLippert: यह गलत है कि " M (M x)और M xएक ही शब्दार्थ होना चाहिए"। M = Listउदाहरण के लिए लें : सूचियों की सूची सूचियों के समान नहीं है। जब Mएक इकाई है, वहाँ एक है परिवर्तन से (अर्थात् इकाई गुणा) M (M x)को M xजो उन दोनों के बीच संबंध बताते हैं, लेकिन वे "एक ही अर्थ विज्ञान" नहीं है।
एंड्रेज बॉयर

जवाबों:


14

nullएक डिफ़ॉल्ट उपहार के रूप में मूल्य हर जगह सिर्फ एक है वास्तव में टूट विचार है, ताकि के बारे में भूल जाते हैं।

आपके पास हमेशा वही अवधारणा होनी चाहिए जो आपके वास्तविक डेटा का सबसे अच्छा वर्णन करती है। यदि आपको एक प्रकार की आवश्यकता होती है जो "अनकाउन्ट", "कुछ भी नहीं" और "मूल्य" इंगित करता है, तो आपको ठीक यही होना चाहिए। लेकिन अगर यह आपकी वास्तविक आवश्यकताओं के अनुरूप नहीं है तो आपको ऐसा नहीं करना चाहिए। यह देखना एक अच्छा विचार है कि अन्य लोग क्या उपयोग करते हैं और उन्होंने क्या प्रस्तावित किया है, लेकिन आपको उन्हें आँख बंद करके पालन करने की आवश्यकता नहीं है।

जो लोग मानक पुस्तकालयों को डिज़ाइन करते हैं, वे सामान्य उपयोग पैटर्न का अनुमान लगाने की कोशिश करते हैं, और वे आमतौर पर इसे अच्छी तरह से करते हैं, लेकिन अगर आपको कोई विशिष्ट चीज़ चाहिए, तो आपको इसे स्वयं परिभाषित करना चाहिए। उदाहरण के लिए, हास्केल में, आप परिभाषित कर सकते हैं:

data UnknownNothing a =
     Unknown
   | Nothing
   | Value a

यह मामला भी हो सकता है कि आपको कुछ और वर्णनात्मक का उपयोग करना चाहिए जो याद रखना आसान है:

data UserInput a =
     Unknown
   | NotGiven
   | Answer a

आप विभिन्न परिदृश्यों के लिए उपयोग किए जाने वाले 10 प्रकारों को परिभाषित कर सकते हैं। दोष यह है कि आपके पास पहले से मौजूद लाइब्रेरी फ़ंक्शंस (जैसे कि वे Maybe) उपलब्ध नहीं होंगे , लेकिन यह आमतौर पर एक विवरण बन जाता है। यह अपनी खुद की कार्यक्षमता जोड़ने के लिए कठिन नहीं है।


जब आप देखते हैं तो यह सही समझ में आता है। मैं ज्यादातर विचारों में दिलचस्पी रखता हूं, मौजूदा पुस्तकालय समर्थन सिर्फ एक बोनस है :)
Stijn

यदि केवल इस प्रकार के निर्माण में बाधा कई भाषाओं में कम थी। : /
राफेल

यदि केवल लोगों ने 1960 के दशक (या उनके पुनर्जन्म से 1980) की भाषाओं का उपयोग बंद कर दिया।
बाउर

@AndrejBauer: क्या? लेकिन तब सिद्धांतकारों को शिकायत करने के लिए कुछ भी नहीं होगा!
०२:२

हम शिकायत नहीं करते, हम अलग हैं।
बाउर Andrej ’

4

जहाँ तक मुझे पता है, nullसी # में मूल्य कुछ चर के लिए एक संभावित मूल्य है , जो इसके प्रकार (मैं सही हूँ) पर निर्भर करता है। उदाहरण के लिए, कुछ वर्ग के उदाहरण। बाकी प्रकारों (जैसे int, boolआदि) के लिए आप इसके साथ int?या bool?इसके बजाय चर घोषित करके इस अपवाद मूल्य को जोड़ सकते हैं (यह बिल्कुल वैसा ही है जैसा कि Maybeनिर्माता आगे बताता है)।

Maybeकार्यात्मक प्रोग्रामिंग से प्रकार निर्माता एक दिया डेटाप्रकार के लिए इस नए अपवाद मूल्य कहते हैं। इसलिए यदि Intपूर्णांक का प्रकार है या Gameकिसी खेल की स्थिति का प्रकार है, तो Maybe Intसभी पूर्णांकों के साथ-साथ एक शून्य (कभी-कभी कुछ भी नहीं कहा जाता है ) मान होता है। उसी के लिए Maybe Game। यहां, कोई प्रकार नहीं हैं जो nullमूल्य के साथ आते हैं । जरूरत पड़ने पर आप इसे जोड़ते हैं।

IMO, यह अंतिम दृष्टिकोण किसी भी प्रोग्रामिंग भाषा के लिए बेहतर है।


हां, C # की आपकी समझ सही है। तो क्या मैं आपके उत्तर से यह अनुमान लगा सकता हूं कि आप घोंसले बनाने Maybeऔर nullपूरी तरह से छोड़ने का सुझाव देते हैं ?
Stijn

2
मेरी राय इस बारे में है कि भाषा कैसी होनी चाहिए। मैं वास्तव में C # प्रोग्रामिंग की सर्वोत्तम प्रथाओं को नहीं जानता। आपके मामले में, सबसे अच्छा विकल्प एक डेटाटाइप को परिभाषित करना होगा जैसा कि @Andrej Bauer वर्णित है, लेकिन मुझे लगता है कि आप C # में ऐसा नहीं कर सकते।
यूरो

@Euge: बीजगणित सम प्रकार (लगभग) शास्त्रीय OO- शैली उपप्रकार और उप-प्रकार बहुरूपता संदेश प्रेषण के साथ अनुमानित किया जा सकता है। उदाहरण के लिए, स्केला में ऐसा कैसे किया जाता है, बंद प्रकारों की अनुमति देने के लिए एक अतिरिक्त मोड़ के साथ । प्रकार एक अमूर्त सुपरक्लास बन जाता है, प्रकार के कंस्ट्रक्टर कंक्रीट उप-वर्ग बन जाते हैं, कंस्ट्रक्टरों के ऊपर मेल खाने वाले पैटर्न को मामलों को कंक्रीट उप-वर्गों या isinstanceपरीक्षणों में अतिभारित तरीकों में स्थानांतरित करके या तो अनुमानित किया जा सकता है । स्काला में "उचित" पैटर्न भी है, और C just वास्तव में अभी हाल ही में सरल पैटर्न भी प्राप्त किया है।
जोर्ग डब्ल्यू मित्तग 15

"अतिरिक्त मोड़" मैं स्काला के लिए उल्लेख किया है "मानक" संशोधक "आभासी" (एक वर्ग है कि से विरासत में मिला जा सकता है के लिए) और के अलावा वह यह है कि final(एक वर्ग है कि से विरासत में मिला नहीं किया जा सकता के लिए), यह भी है sealed, एक के लिए वर्ग जो केवल एक ही संकलन इकाई के भीतर बढ़ाया जा सकता है । इसका मतलब यह है कि संकलक सभी संभावित उपवर्गों को जान सकता है (बशर्ते कि वे सभी या तो स्वयं हैं sealedया final) और इस प्रकार पैटर्न मैचों के लिए थकावट की जांच करते हैं, जो कि रनटाइम कोड लोडिंग और अप्रतिबंधित विरासत के साथ एक भाषा के लिए सांख्यिकीय रूप से संभव नहीं है।
जोर्ग डब्ल्यू मित्तग 15

बेशक आप सी # में उन शब्दार्थों के साथ प्रकार डिजाइन कर सकते हैं। ध्यान दें कि C # बिल्ट-इन शायद टाइप (Nullable in C #) को नेस्टेड करने की अनुमति नहीं देता है। int??C # में अवैध है।
एरिक लिपर्ट

3

यदि आप टाइप यूनियनों को परिभाषित कर सकते हैं, जैसे X or Y, और यदि आपके पास एक प्रकार है जिसका नाम Nullकेवल nullमूल्य (और कुछ नहीं) का प्रतिनिधित्व करता है , तो किसी भी प्रकार के लिए T, T or Nullवास्तव में इससे अलग नहीं है Maybe T। साथ ही समस्या nullहै जब भाषा व्यवहार करता है एक प्रकार Tके रूप में T or Nullपरोक्ष बनाने null(भाषाओं उन्हें है कि में आदिम प्रकार को छोड़कर) हर प्रकार के लिए एक मान्य मान। यह जावा में उदाहरण के लिए होता है जहां एक फ़ंक्शन जो Stringभी स्वीकार करता है null

यदि आप मानों के सेट के orरूप में और सेट के संघ के रूप में व्यवहार (T or Null) or Nullकरते हैं , तो मूल्यों के सेट का प्रतिनिधित्व करता है T ∪ {null} ∪ {null}, जो कि जैसा है वैसा ही है T or Null। ऐसे कंपाइलर हैं जो इस तरह के विश्लेषण (SBCL) करते हैं। जैसा कि टिप्पणियों में कहा गया है, आप आसानी से भेद नहीं कर सकते Maybe Tऔर Maybe Maybe Tजब आप प्रकारों को डोमेन के रूप में देखते हैं (दूसरी ओर, यह दृश्य गतिशील रूप से टाइप किए गए कार्यक्रमों के लिए काफी उपयोगी है)। लेकिन आप प्रकारों को बीजगणितीय अभिव्यक्तियों के रूप में भी रख सकते हैं, जहां (T or Null) or Nullकई स्तरों के Maybes का प्रतिनिधित्व करता है।


2
वास्तव में, यह महत्वपूर्ण है जो Maybe (Maybe X)समान नहीं है Maybe XNothingके रूप में एक ही बात नहीं है Just NothingMaybe (Maybe X)साथ उलझना बहुरूपता Maybe Xका इलाज असंभव बना देता है Maybe _
गिल्स एसओ- बुराई को रोकना '

1

आपको यह पता लगाने की आवश्यकता है कि आप क्या व्यक्त करना चाहते हैं, और फिर एक तरीका खोजें कि इसे कैसे व्यक्त करें।

सबसे पहले, आपके पास आपकी समस्या डोमेन (जैसे संख्या, तार, ग्राहक रिकॉर्ड, बूलियन, आदि) में मान हैं। दूसरा, आपके पास आपकी समस्या डोमेन मूल्यों के शीर्ष पर कुछ अतिरिक्त, सामान्य मूल्य हैं: उदाहरण के लिए "कुछ भी नहीं" (मूल्य की ज्ञात अनुपस्थिति), "अज्ञात" (किसी मूल्य की उपस्थिति या अनुपस्थिति के बारे में कोई ज्ञान नहीं), उल्लेख नहीं था " कुछ "(निश्चित रूप से एक मूल्य है, लेकिन हम नहीं जानते कि कौन सा)। शायद आप अन्य स्थितियों के बारे में सोच सकते हैं।

यदि आप इन तीन अतिरिक्त मूल्यों के साथ-साथ सभी मूल्यों का प्रतिनिधित्व करने में सक्षम होना चाहते हैं, तो आप "कुछ भी नहीं", "अज्ञात", "कुछ", और "मूल्य" मामलों के साथ एक दुश्मनी पैदा करेंगे।

कुछ भाषाओं में कुछ मामले सरल होते हैं। उदाहरण के लिए, स्विफ्ट में आपके पास हर प्रकार के लिए टाइप "वैकल्पिक टी" है, जिसमें इसके संभावित मान शून्य हैं और टी के सभी मान हैं। यह आपको कई स्थितियों को आसानी से संभालने देता है, और अगर आपके पास "कुछ भी नहीं" और "सही" है मूल्य "। यदि आप "अज्ञात" और "मान" का उपयोग कर सकते हैं। यदि आपको "कुछ भी नहीं", "अज्ञात" और "मूल्य" को संभालने की आवश्यकता है तो आप इसका उपयोग नहीं कर सकते । अन्य भाषाएं "अशक्त" या "शायद" का उपयोग कर सकती हैं, लेकिन यह सिर्फ एक और शब्द है।

JSON में, आपके पास कुंजी / मान युग्म के साथ शब्दकोशों हैं। यहां, एक कुंजी केवल एक शब्दकोश से गायब हो सकती है, या इसमें शून्य का मान हो सकता है। इसलिए ध्यान से वर्णन करके कि चीजें कैसे संग्रहीत की जाती हैं, आप सामान्य मूल्यों और दो अतिरिक्त मूल्यों का प्रतिनिधित्व कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.