2012-12-07 16 views
28

में शामिल किया जा सकता है कूल नए एफ # 3.0 फीचर प्रकार प्रदाताओं का उपयोग एफ # डेटा प्रकारों या कक्षाओं और डेटा स्रोत संरचनाओं जैसे एक्सएमएल या डब्लूएसडीएल के बीच मेल नहीं खा सकता है। हालांकि यह विसंगति अन्य .NET भाषाओं जैसे सी # में भी एक चुनौती है।एफ # प्रकार प्रदाताओं को सी #

मैं सी # कोड में एफ # 3.0 प्रदाताओं का उपयोग करना चाहता हूं। मैं यह कैसे कर सकता हूं, अगर बिल्कुल? इसके अलावा, अगर हम नहीं कर सकते हैं, तो सी # कार्यान्वयन का उपयोग करने में सक्षम होना चाहिए?

+1

यह समुदाय विकी के रूप में होना चाहिए। मेरा मानना ​​है कि यह काफी लंबी चर्चाओं को चकित करेगा। –

उत्तर

9

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

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

let moviesStartingWith prefix = 
    query { 
     for movie in MyDataSource.Movies do 
     where (movie.Title.StartsWith(prefix) } 
    |> Seq.toList 

सी # में, मैं वापसी प्रकार निर्दिष्ट करने की आवश्यकता होगी (जैसे List<DataSource.ServiceTypes.Movie>) जो एक कोर होने के समाप्त होता है, और जिसका अर्थ है कि इंटेलिसेन्स के साथ भी, मैं क्वेरी उत्पन्न करने के लिए प्रदत्त मानों के सेट के माध्यम से डॉट करने के अलावा हस्ताक्षर उत्पन्न करने के लिए प्रदान किए गए प्रकारों के सेट के माध्यम से डॉट कर रहा हूं।

यह प्रदाता प्रदाताओं के अलावा अन्य क्षेत्रों पर भी लागू होता है, लेकिन मुझे लगता है कि कुछ नेस्टेड प्रकार पदानुक्रमों के साथ जो कुछ प्रदाताओं द्वारा स्वाभाविक रूप से उत्पन्न होते हैं, यह विशेष रूप से अभ्यास में दर्दनाक होगा क्योंकि प्रकार के नाम बन जाते हैं बहुत लंबा

+2

सी # प्रकार अनुमान आपके लिए क्रेडिट देने से बेहतर हो सकता है। यहां तक ​​कि यदि यह इनलाइन कथन के बजाय एक विधि था, तो कोई भी विधि हस्ताक्षर पर एक प्रकार पैरामीटर डाल सकता है, और 'MyDataSource.Movies' में गुजरने का कार्य बंद प्रकार निर्दिष्ट करने के बिना टाइप पैरामीटर को बाध्य करेगा, और छोड़कर वापसी प्रकार 'सूची '। – codekaizen

24

मुझे लगता है कि @kvb कुछ तकनीकी कठिनाइयों का एक अच्छा अवलोकन देता है। मैं सहमत हूं प्रकार अनुमान समस्याग्रस्त हो जाएगा - आप स्थानीय रूप से अज्ञात प्रकार पर प्रदाता उत्पन्न प्रकारों का उपयोग करने के लिए सीमित होंगे। मुझे लगता है कि सी # रोज़लिन में समान कुछ के साथ आ सकता है, लेकिन मुझे संदेह है कि यह एफ # (जहां टाइप प्रदाता वास्तव में भाषा सुविधा है और न केवल टूल) के रूप में सुंदर और आसानी से एकीकृत किया जाएगा।

अपने दो प्रश्नों का उत्तर प्राप्त करने के लिए:

[मैं कैसे कर सकते हैं] का उपयोग एफ # सी # कोड में 3.0 प्रदाताओं?

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

प्रकार प्रदाताओं को मिटाकर आप ऐसा करने में सक्षम नहीं होंगे, क्योंकि प्रकार वास्तव में मौजूद नहीं हैं और केवल F # उन्हें देख सकते हैं। तो सबसे अच्छा विकल्प है कि अपने प्रोसेसिंग कोड को एफ # में लिखना और रिकॉर्ड्स के रिकॉर्ड्स या अन्य प्रकारों के संग्रह के रूप में वापसी करना है जिन्हें सी # से आसानी से खपत किया जाता है।

सी # कार्यान्वयन का उपयोग करने में सक्षम होने की आवश्यकता क्या होगी?

मैं निश्चित रूप से कह सकता हूं, "सी # को प्रकार प्रदाताओं का समर्थन करना होगा!", लेकिन यहां कुछ और विचार हैं। टाइप प्रदाता सिर्फ .NET असेंबली हैं और वे किसी भी F #-विशिष्ट प्रकार का उपयोग नहीं करते हैं। ITypeProvider interface किसी भी .NET भाषा द्वारा सी # सहित उपभोग किया जा सकता है, इसलिए यदि सी # डिजाइनर चाहते थे, तो वे पहले से ही F # के लिए बनाए गए सभी महान प्रदाताओं का पुन: उपयोग कर सकते हैं।

तो, इस सुझाव को C# user voice पर सबमिट करें या इसे कहीं और समर्थन दें (या इसे लागू करने के लिए मोनो टीम को मनाने के लिए!) और शायद इसे सी # (vNext + 1 + ...) में जोड़ा जाएगा। अभी के लिए, आप केवल F # में सभी लाभ प्राप्त करेंगे।

+0

महान प्रतिक्रिया के लिए धन्यवाद। मुझे यकीन नहीं है कि मैं जेनरेटिव और मिटाने वाले टाइप प्रदाताओं के बीच अंतर को पूरी तरह से समझता हूं। मुझे इस विषय के बारे में अतिरिक्त जानकारी कहां मिल सकती है? मुझे लगता है कि विश्व बैंक प्रकार प्रदाता एक मिटाने वाले प्रकार प्रदाता का एक उदाहरण है। लेकिन एक सीएसवी प्रकार प्रदाता के बारे में कैसे। यह भी एक मिटा प्रकार प्रदाता? – carstenj

+0

"तो सबसे अच्छा विकल्प है कि आप अपने प्रोसेसिंग कोड को एफ # में लिखना चाहते हैं और परिणाम को रिकॉर्ड्स या अन्य प्रकार के संग्रह के रूप में लौटाते हैं जिन्हें सी # से आसानी से खपत किया जाता है।" क्या आपके पास इसका कोई कोड उदाहरण है? –

+0

@ निर्बाध मैंने इस पर एक Pluralsight वीडियो किया: https://www.pluralsight.com/courses/accessing-data-fsharp-type-providers यह वास्तव में अगले 2 दिनों में मुफ्त में उपलब्ध है (लेकिन आपको होना चाहिए बाद में भी मुफ्त परीक्षण प्राप्त करने में सक्षम)। –

संबंधित मुद्दे