2009-12-14 16 views
8

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

उत्तर

11

इकाई प्रकार बस सब कुछ अधिक नियमित बनाता है। एक हद तक आप एक ही पैरामीटर लेने और एकल परिणाम लौटने के रूप में F # में प्रत्येक फ़ंक्शन के बारे में सोच सकते हैं। जिन कार्यों को किसी भी पैरामीटर की आवश्यकता नहीं है, वे वास्तव में पैरामीटर के रूप में "यूनिट" लेते हैं, और ऐसे फ़ंक्शन जो परिणामस्वरूप "यूनिट" वापस नहीं लौटाते हैं। इसमें कई फायदे हैं; एक के लिए, विचार करें कि कैसे सी # में आपको "फंक" प्रतिनिधियों की आवश्यकता होती है जो विभिन्न आबातियों के कार्यों का प्रतिनिधित्व करने के लिए मूल्यों को वापस लौटाते हैं, साथ ही साथ "एक्शन" प्रतिनिधियों की संख्या जो मूल्य वापस नहीं करते हैं (क्योंकि उदाहरण Func<int,void> कानूनी नहीं है - शून्य का उपयोग इस तरह से नहीं किया जा सकता है, क्योंकि यह काफी 'असली' प्रकार नहीं है)।

F# function types: fun with tuples and currying

+0

अच्छी तरह से +1 – Dario

+0

समझाया गया है और() सिर्फ एन-आरी टुपल्स का तार्किक अंत है, 0-तत्व ट्यूपल! – Dario

+0

धन्यवाद! चिह्नित। –

8

कार्यात्मक प्रोग्रामिंग में, हम आम तौर पर आउटपुट में इनपुट मैपिंग के बारे में बोलते हैं। इसका शाब्दिक अर्थ है कि इसके वापसी मूल्य (ओं) के लिए एक तर्क मैपिंग। लेकिन अगर कुछ गणितीय/श्रेणी-सिद्धांत अर्थ में कोई कार्य होने जा रहा है, तो उसे कुछ वापस करना होगा। एक void मान दर्शाता है कि एक फ़ंक्शन कुछ भी नहीं लौटाता है, जो इन शर्तों में गैरकानूनी है।

unitvoid का कार्यात्मक उत्तर है। यह अनिवार्य रूप से केवल एक मान के साथ एक प्रकार है, ()। इसमें कई उपयोग हैं, लेकिन यहां एक सरल है। मान लीजिए कि आप एक और अधिक परंपरागत अनिवार्य भाषा में कुछ इस तरह था करते हैं:

public static <T, U> List<U> map(List<T> in, Function<T, U> func) { 
    List<U> out = new ArrayList<U>(in.size()); 
    for (T t : in) { 
    out.add(func.apply(t)); 
    } 
    return out; 
} 

इस सूची में प्रत्येक तत्व के लिए एक विशेष कार्य func लागू होता है, func के उत्पादन प्रकार की एक नई सूची का निर्माण किया। लेकिन क्या होता है यदि आप उस फ़ंक्शन में गुजरते हैं जो सिर्फ अपने तर्कों को प्रिंट करता है? इसमें आउटपुट प्रकार नहीं होगा, तो आप U के लिए क्या डाल सकते हैं?

कुछ भाषाओं में, इस तरह के फ़ंक्शन में गुजरने से यह कोड टूट जाएगा (जैसे सी # में, जहां आप void को सामान्य प्रकार में असाइन नहीं कर सकते हैं)। आपको Action<T> जैसे वर्कअराउंड का सहारा लेना होगा, जो घबराहट हो सकता है।

यह वह जगह है जहां unit की अवधारणा उपयोगी है: यह एक प्रकार है, लेकिन एक है कि केवल एक ही मूल्य पर लग सकता है है। यह चेनिंग और रचना जैसी चीजों को बहुत सरल बनाता है, और विशेष मामलों की संख्या को कम कर देता है जिनके बारे में आपको चिंता करना है।

+0

+1 इस उत्तर के लिए भी देखें। आपका स्निपेट बहुत अच्छी तरह से था। धन्यवाद! –