वैकल्पिक और अशक्त प्रकार के बीच क्या अंतर है


15

स्विफ्ट है Optionals। C # के Nullableप्रकार हैं।

जहां तक ​​मैं दोनों को एक ही उद्देश्य के बारे में बता सकता हूं, इसके अलावा कुछ प्रकार के मूल्य वे जानकारी संग्रहीत करते हैं कि क्या चर का मूल्य अपरिभाषित है या (अपरिभाषित)।

प्रश्न Optionalsकेवल Nullableअलग-अलग नाम के प्रकार हैं या अन्य वैचारिक मतभेद हैं?

दूसरे शब्दों में, अवधारणा के बारे में बात करते हुए, या उन भाषाओं के संदर्भ में , जिनके पास Optionalsया नहीं है Nullables, क्या यह शब्द का उपयोग किया जाता है?

भाषा में उस कार्यक्षमता को लागू करते समय यह मायने रखता है कि मैं नाम टाइप करता हूं Optionals<T>याNullable<T>


एक भाषा अज्ञेय के दृष्टिकोण से, वे समान हैं। उस ने कहा, एक भाषा अवधारणाओं में अंतर कर सकती है (जैसे कि पैटर्न मिलान लागू है या नहीं)।
थॉमस ईडिंग

C # में विकल्प भी हो सकते हैं (यह सिर्फ एक राक्षसी पैटर्न है): github.com/louthy/language-ext
Den

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

जवाबों:


5

एक अलग अर्थ है, भले ही वे बहुत समान रूप से काम करते हैं। हर कोई, लेकिन माइक्रोसॉफ्ट (डालने आंख रोल यहाँ) का उपयोग करता है nullऔर nullableकेवल संदर्भ के संदर्भ में। Optionsऔर Maybesआमतौर पर संदर्भ और मूल्यों दोनों को संदर्भित करने के लिए समझा जाता है, विशेष रूप से कार्यात्मक प्रोग्रामिंग भाषाओं में जहां संदर्भात्मक पारदर्शिता का अर्थ है कि एक मूल्य और संदर्भ के बीच बहुत अंतर नहीं है।

दूसरे शब्दों में, अवधारणा के बारे में बात करना, या उन भाषाओं के संदर्भ में, जिनके पास नहीं है Optionalsया Nullablesक्या यह मायने रखता है कि किस शब्द का उपयोग किया जाता है?

Optionsवह शब्द है जो व्यापक दर्शकों के बीच कम से कम भ्रम का कारण बनता है। केवल C # प्रोग्रामर Nullableएक मूल्य प्रकार के लिए संभावित रूप से आवेदन करने के बारे में सोचेंगे, और मुझे लगता है कि उनमें से ज्यादातर कम से कम एक क्या है के बारे में जानते हैं Option


हर कोई लेकिन Microsoft और SQL के डिजाइनरों, मुझे लगता है कि आप मतलब है।
जूल्स

9

.NET में, दो प्रकार की श्रेणियां हैं: संदर्भ और मान (इंट, डबल, स्ट्रक्चर्स, एनम आदि)। उनके अंतर के बीच यह तथ्य है कि एक संदर्भ हो सकता है null, जबकि एक मूल्य नहीं हो सकता है। इस प्रकार यदि आपके पास एक मूल्य प्रकार है और "वैकल्पिक" या "अज्ञात" शब्दार्थ को व्यक्त करना चाहते हैं, तो आप इसके साथ सज सकते हैं Nullable<>। ध्यान दें कि Nullable<>केवल मूल्य प्रकार (यह एक where T : structखंड है) को स्वीकार करने के लिए प्रकार से विवश है । Nullable<>संकलक से विशेष व्यय भी होता है जिससे nullमूल्य का संरक्षण किया जाता है NullReferenceExceptions:

string x = null;
x.ToString(); // throws a NullReferenceException

int? y = null;
y.ToString(); // returns ""

कार्यात्मक भाषाओं (जैसे स्काला, एफ #, हास्केल, स्विफ्ट आदि) में यह आम बात है nullकरने के लिए मौजूद नहीं । ऐसा इसलिए है क्योंकि पूरे लोग nullएक बुरे विचार के अस्तित्व को मानते हैं , और भाषा डिजाइनरों ने इसे अस्वीकार करके इस समस्या का समाधान करने का निर्णय लिया है।

इसका मतलब यह है कि फिर से हमें इन भाषाओं में एक गैर-मूल्य का प्रतिनिधित्व करने के लिए किसी तरह की आवश्यकता है । Optionप्रकार दर्ज करें (नामकरण भिन्न होता है, इसे Maybeहास्केल में कहा जाता है)। यह इसी तरह का काम करता है Nullableकि यह मामले को जोड़ने के लिए एक प्रकार लपेटता है जहां मान "कोई नहीं" या "अज्ञात" आदि है।

वास्तविक अंतर आपको लागू होने वाली भाषाओं द्वारा दिए गए अतिरिक्त कार्यों में है Option। एक उदाहरण के रूप में, Option.map(छद्मकोश में) लें:

function Option<T2> Option.map(opt: Option<T1>, mapFunc: T1 -> T2) {
    if (opt is None) return None
    else return Option<T2>(mapFunc(opt.Value))
}

चाइनिंग फ़ंक्शंस, Option.mapसी # में हर जगह दिखने वाले विशिष्ट नल चेक बॉयलर से बचने का एक शक्तिशाली तरीका है:

if (service == null)
    return null;
var x = service.GetValue();
if (x == null || x.Property == null)
    return null;
return x.Property.Value;

C # में अशक्त समकक्ष होगा:

public static Nullable<T2> Map<T1, T2>(this Nullable<T1> nullable, Func<T1, T2> f)
    where T1 : struct
    where T2 : struct
{
    if (!nullable.HasValue) return (T2?)null;
    else return (T2?) f(nullable.Value);
}

हालाँकि C # में इसकी सीमित उपयोगिता है क्योंकि यह केवल मूल्य प्रकारों के लिए काम करेगा।

C # का नया संस्करण "शून्य प्रसार" ऑपरेटर ( ?.) प्रदान करता है जो Option.mapफ़ंक्शन के समान है, सिवाय इसके कि यह केवल विधियों और संपत्ति अभिगमकर्ताओं के लिए लागू हो। उपरोक्त नमूने को फिर से लिखा जाएगा

return service?.GetValue()?.Property?.Value;

C # एक अशुद्ध कार्यात्मक भाषा है (F # के रूप में)। इसके अलावा F # में नल हैं।
डेन

C # 6 में शून्य मान ज़बरदस्ती है, इसलिए आपका कम से कम कुछ कोड अप टू डेट नहीं है: github.com/dotnet/roslyn/wiki/… roslyn.codeplex.com/discussions/540883
Den

इसके अलावा विकल्प लागू करना आसान है: github.com/louthy/language-ext
Den

1
@ डन: सी # ओप की ओर झुकता है जबकि एफ # एफपी की ओर झुकता है। डिफ़ॉल्ट रूप से करी और परिवर्तनशीलता का अभाव गंभीर कार्यात्मक प्रोग्रामिंग के लिए C # उपयुक्त नहीं है। मैंने उत्तर के अंत में अशक्त प्रचार का उल्लेख किया। विकल्प वास्तव में सी # में लागू करने के लिए सरल हैं लेकिन यह सवाल से दूर है।
एलेक्सफॉक्सगिल

4
@ मुझे लगता है कि आपकी टिप्पणियों में शब्दों के कुछ खराब विकल्प हैं। एक अशुद्ध कार्यात्मक भाषा एक कार्यात्मक भाषा है जो साइड इफेक्ट की अनुमति देती है। C # में कुछ कार्यात्मक विशेषताएं हो सकती हैं और आप उन्हें बहुत प्रभाव में उपयोग कर सकते हैं, लेकिन यह एक कार्यात्मक भाषा नहीं है। मुझे लगता है कि आपका मतलब है कि न तो भाषा 100% कार्यात्मक है, लेकिन F # OCaml के बहुत करीब है, जो कि एक कार्यात्मक भाषा है। कार्यात्मक प्रतिमान से जो भी विचलन होता है, वह ज्यादातर मौजूद होता है इसलिए यह विदेशी .NET कोड के साथ इंटरोपर्ट कर सकता है। बिंदु में मामला, nullएफ # प्रकारों के लिए एक वैध मूल्य नहीं है।
डोभाल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.