F # का उपयोग किन क्षेत्रों में C # से अधिक उपयुक्त हो सकता है? [बन्द है]


210

पिछले कुछ वर्षों में एफ # माइक्रोसॉफ्ट के पूरी तरह से समर्थित भाषाओं में से एक में विकसित हुआ है, जो ओकेएमएल, एमएल और हास्केल में कई विचारों को रोजगार देता है।

पिछले कई वर्षों में C # ने अधिक से अधिक कार्यात्मक भाषा सुविधाओं को पेश करके अपनी सामान्य उद्देश्य सुविधाओं को बढ़ाया है: LINQ (सूची समझ), लम्बदा, क्लोजर, बेनामी प्रतिनिधि और अधिक ...

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

मुझे आपके उत्पादन पॉलीग्लॉट कार्यक्रमों में इन दो भाषाओं को नियोजित करने में दिलचस्पी है और उत्पादन सॉफ्टवेयर (वेब ​​ऐप, क्लाइंट ऐप, सर्वर ऐप) के भीतर के क्षेत्र जो आपने पिछले साल में एफ # में लिखे हैं या इसलिए कि आपने पहले किया था C # में लिखा है।

जवाबों:


258

मैंने ऊर्जा स्टेशनों के लिए एक व्यापारिक स्थिति के लिए बिजली स्टेशनों के पोर्टफोलियो के लिए राष्ट्रीय बिजली उत्पादन अनुसूची को संतुलित करने के लिए एक आवेदन लिखा है। क्लाइंट और सर्वर घटक C # में थे, लेकिन गणना इंजन F # में लिखा गया था।

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

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

व्याख्यात्मक प्रोग्रामिंग स्क्रिप्ट फ़ाइलों और आरईपीएल (एफ # इंटरएक्टिव) के साथ काम करते हुए मुझे अधिक पारंपरिक एडिट / कंपाइल / रन / टेस्ट लूप की तुलना में कार्यान्वयन करने से पहले समाधान स्थान का अधिक प्रभावी ढंग से पता लगाने की अनुमति दी गई। यह एक प्रोग्रामर के लिए समस्या की अपनी समझ बनाने और खेलने में डिज़ाइन तनाव के लिए एक बहुत ही स्वाभाविक तरीका है।

यूनिट परीक्षण कोड गैर-साइड इफेक्टिंग फ़ंक्शन और अपरिवर्तनीय डेटा संरचनाओं का उपयोग करके लिखा गया है जो परीक्षण के लिए एक खुशी है। चीजों को पेंच करने के लिए कोई जटिल समय-निर्भर बातचीत नहीं होती है या निर्भरता के बड़े सेट का मजाक उड़ाया जाता है।

अंतर्वेशन I ने इंटरफ़ेस को C # में गणना इंजन में परिभाषित किया और F # में गणना को लागू किया। गणना इंजन को किसी भी C # मॉड्यूल में इंजेक्ट किया जा सकता है जिसे इंटरऑपरेबिलिटी के बारे में किसी भी चिंता के बिना इसका उपयोग करने की आवश्यकता होती है। निर्बाध। C # प्रोग्रामर को कभी पता नहीं होना चाहिए।

कोड की कमी बहुत कुछ गणना इंजन में खिलाया गया डेटा वैक्टर और मेट्रिसेस के रूप में था। उच्चतर ऑर्डर फ़ंक्शन नाश्ते के लिए न्यूनतम उपद्रव, न्यूनतम कोड के साथ इन्हें खाते हैं। सुंदर।

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

समानांतरवाद परिणामी कार्यान्वयन की कार्यात्मक शुद्धता डेटा के प्रसंस्करण वैक्टर में निहित समानता का शोषण करने के लिए परिपक्व होती है। शायद यह वह जगह है जहां मैं अब जाऊंगा। .NET 4 बाहर है।


18
+1 यह समझाने के लिए कि एफ # नंबर क्रंचिंग इंजन के लिए बहुत अनुकूल है। माप की इकाइयों का उल्लेख करने के लिए एक और (आभासी) +1। भाषा का वह हिस्सा अधिक बार उल्लिखित होने के योग्य है।
cfern

5
महान जवाब, प्रासंगिक, समकालीन और जटिलता से निपटने के लिए एफ # उपयुक्तता, मैंने इसे पढ़ने से बहुत कुछ सीखा, धन्यवाद
पीटर मैकजी

महान जवाब साइमन, और जैसा कि डॉन ने कल रात उल्लेख किया, अपनी हाल की स्लाइड्स में उद्धृत किया। "कार्ट में जोड़ें" लिंक जोड़ने का समय?
क्रिस बॉलर

1
नमस्ते, क्या आपको हमें अपने ऐप्स आर्किटेक्चर के बारे में अधिक बताने की अनुमति है?
निकोस

76

Microsoft अनुसंधान में अपनी इंटर्नशिप के दौरान, मैंने F # के लिए विज़ुअल स्टूडियो IntelliSense के कुछ हिस्सों पर काम किया (जो स्वयं F # में लिखा गया है)। मुझे पहले से ही C # प्रोजेक्ट से IntelliSense के साथ कुछ अनुभव था, इसलिए मुझे लगता है कि मैं दोनों की तुलना कर सकता हूं।

  • विजुअल स्टूडियो एक्स्टेंसिबिलिटी अभी भी COM पर आधारित है, इसलिए आपको उन वस्तुओं से निपटने की आवश्यकता है जो बहुत अच्छी .NET ऑब्जेक्ट्स नहीं हैं (और निश्चित रूप से कार्यात्मक नहीं हैं), लेकिन मुझे नहीं लगता कि C # और F # के बीच कोई बड़ा अंतर है (यह आसानी से काम करता है) एफ # से)

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

इससे पहले, मैंने एफ # के लिए कोडडॉम प्रदाता (एफ # में भी लिखा गया) पर भी काम किया। मैंने वास्तव में C # में पहला प्रयोग किया, लेकिन फिर कोड को F # में बदल दिया।

  • कोडडॉम प्रदाता को .NET ऑब्जेक्ट्स का उपयोग करके प्रतिनिधित्व किए गए कुछ संरचना को पार करने की आवश्यकता होती है, इसलिए डेटा के अपने स्वयं के प्रतिनिधित्व का आविष्कार करने के लिए बहुत जगह नहीं है (जो कि क्षेत्र है जहां एफ # अच्छा लाभ प्रदान कर सकता है)।

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

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


6
बहुत दिलचस्प, अधिक सबूत कि माइक्रोसॉफ्ट के भीतर एफ # का उत्थान निश्चित रूप से उच्च है, क्या एक महान इंटर्नशिप जो होना चाहिए था!
पीटर मैक्

43

हम दुनिया का पहला वाणिज्यिक उत्पाद एफ # (में लिखा भेज दिया दृश्य के लिए एफ # ) और दूसरा ( अंकीय के लिए एफ # ) के साथ ही एफ # (पर पहली व्यावसायिक साहित्य एफ # .NET जर्नल ) और लिखा था और वर्तमान संस्करण के बारे में ही पुस्तक प्रकाशित of F # ( तकनीकी कंप्यूटिंग के लिए विजुअल एफ # 2010 )।

हम C # (उदाहरण के लिए ) में लिखी गई समान लाइनों के साथ उत्पादों का शिपिंग कर रहे थे, लेकिन हमारे पास OCaml के व्यावसायिक उपयोग में एक मजबूत पृष्ठभूमि भी थी। हम F # के उत्साही शुरुआती दत्तक थे, जब यह 2006 में एक शोध प्रोटोटाइप था, क्योंकि हमने औद्योगिक-ताकत .NET प्लेटफॉर्म पर एक सभ्य आधुनिक OCaml जैसी भाषा होने की क्षमता को मान्यता दी और, परिणामस्वरूप, हमने इसे उत्पादित करने के लिए धक्का दिया। परिणाम एक अविश्वसनीय सफलता रही है और एफ # हमारी बुलंद अपेक्षाओं को पार कर गया है।

हमारे लिए, एफ # के कई अलग-अलग फायदे हैं और हम इसका उपयोग विभिन्न प्रकार के अनुप्रयोगों के लिए करते हैं। हमारे पास उत्पादन में एफ # कोड की हजारों हजारों लाइनें हैं। अब हम अपने सभी LOB ऐप्स के लिए F # का उपयोग करते हैं: हमारे क्रेडिट कार्ड लेनदेन को F # कोड का उपयोग करके संसाधित किया जाता है, हमारे उत्पाद सूचनाओं को F # कोड का उपयोग करके भेजा जाता है, F # कोड का उपयोग करके हमारी सदस्यता को संभाला जाता है, हमारे खातों को F # कोड का उपयोग करके किया जाता है। शायद मुख्य भाषा विशेषता जो यहां लाभांश का भुगतान करती है, पैटर्न मिलान है। यहां तक ​​कि हमने F # का उपयोग करके रंग वाक्य रचना को हमारी नवीनतम पुस्तक पर प्रकाश डाला ...

हमारा विज़ुअलाइज़ेशन लाइब्रेरी एक बड़ा विक्रेता है और विज़ुअल स्टूडियो में एफ # इंटरएक्टिव पर इसकी कार्यक्षमता केंद्र है। हमारी लाइब्रेरी कम से कम प्रयास (उदाहरण के लिए) के साथ इंटरैक्टिव 2 डी और 3 डी विज़ुअलाइज़ेशन को फैलाने की क्षमता के साथ इसे बढ़ाती हैPlot([Function sin], (-6., 6.))एक साइन लहर की साजिश)। विशेष रूप से, सभी थ्रेडिंग मुद्दे पूरी तरह से स्वचालित हैं ताकि उपयोगकर्ताओं को यूआई थ्रेड्स और डिस्पैच के बारे में चिंता करने की आवश्यकता न हो। पुस्तकालय के इस हिस्से को लिखते समय प्रथम श्रेणी के कार्य और आलस्य अत्यंत मूल्यवान थे और बीजगणितीय डेटाैटिप्स का व्यापक रूप से उपयोग किया गया था। जब हमारे ग्राहकों ने WPF के हिट परीक्षण में प्रदर्शन बग मारा और आसानी से 10,000 × प्रदर्शन सुधार के लिए एफ # में प्रासंगिक कोड को फिर से लागू करने में सक्षम थे, तो यहां प्रदर्शन भी मूल्यवान साबित हुआ। इस उत्पाद के GUI के मुक्त-स्वरूप के कारण, GUI डिज़ाइनर और C # लाभकारी नहीं होगा।

हमारा अधिकांश कार्य संख्यात्मक तरीकों के आसपास घूमता है, जिसमें हमारे वाणिज्यिक पुस्तकालय और पुस्तकें दोनों शामिल हैं। F # इस क्षेत्र में C # की तुलना में अधिक मजबूत है क्योंकि यह न्यूनतम प्रदर्शन दंड के साथ उच्च-स्तरीय अमूर्तता (जैसे उच्च-क्रम के कार्य) प्रदान करता है। इस संदर्भ में हमारा सबसे सम्मोहक परिणाम रैखिक बीजगणित से क्यूआर अपघटन का एक सरल लेकिन सामान्यीकृत कार्यान्वयन का निर्माण था, जो कि लैपैक के संदर्भ कार्यान्वयन से फोरट्रान कोड से 20 × कम था, जो विक्रेता-ट्यून किए गए इंटेल मठ से 3 × तेज था कर्नेल लाइब्रेरी और अधिक सामान्य क्योंकि हमारा कोड किसी भी प्रकार के मैट्रिक्स को संभाल सकता है, यहां तक ​​कि प्रतीकात्मक मैट्रिक्स भी!

वर्तमान में हम F # (हिम्मत के लिए) और शम (शिम के लिए) के मिश्रण में WPF / सिल्वरलाइट घटक विकसित कर रहे हैं, WPF ऐप्स का निर्माण हमारे सॉफ्टवेयर उत्पादों के लिए इंटरैक्टिव मैनुअल के रूप में कार्य करने के लिए कर रहे हैं और मैं एक नई पुस्तक मल्टीकल्चर एफ # लिख रहा हूं, .NET पर साझा-मेमोरी समानांतर प्रोग्रामिंग के लिए निश्चित मार्गदर्शिका होगी।


क्या आप वही जॉन हैरोप हैं जिन्होंने वैज्ञानिकों के लिए "एफ #" लिखा था?
आंद्रे आर्टस

7
हाँ। मैंने 5 साल पहले वैज्ञानिकों के लिए एफ # लिखा था।
जॉन हैरोप

क्या आपके पास एफ # में क्यूआर अपघटन कोड के लिए कुछ प्रकार का संदर्भ है जो आप अपने पैराग्राफ पैराग्राफ में उल्लेख करते हैं? धन्यवाद।
समिक आर

@SikikR: नहीं, क्षमा करें। यह वाणिज्यिक कोड है। हालांकि यह लिखना आसान था।
जॉन हैरोप

@ मल्टीकोर एफ # पर कोई शब्द?
प्रोफेसर bigglesworth

25

पिछले 6 या इतने महीनों में, मैं विजुअल स्टूडियो 2010 के लिए एक विम एमुलेशन लेयर पर काम कर रहा हूं। यह एक मुफ्त उत्पाद है जिसके स्रोत के साथ यह स्वतंत्र रूप से जीथब पर उपलब्ध है।

यह परियोजना 3 डीएलएल में एक अलग परत का प्रतिनिधित्व करती है। प्रत्येक परत में एक संबंधित इकाई परीक्षण dll होता है।

  1. विम इंजन: एफ #
  2. श्रंगार और संपादक एकीकरण के लिए WPF परत: C #
  3. दृश्य स्टूडियो एकीकरण परत: C #

यह पहली बड़ी परियोजना है जिसे मैंने कभी भी F # के साथ किया है और मुझे यह कहना होगा कि मुझे भाषा से प्यार है। कई मायनों में मैंने इस परियोजना को F # सीखने की विधि के रूप में इस्तेमाल किया (और यदि आप परियोजना के इतिहास को देखें तो यह सीखने की अवस्था बहुत अधिक स्पष्ट है)।

मुझे F # के बारे में सबसे आश्चर्यजनक लगता है कि यह एक भाषा का संक्षिप्त रूप है। विम इंजन में तर्क का एक बड़ा हिस्सा शामिल है फिर भी इसमें समग्र कोड आधार का केवल 30% शामिल है।


19
संपादक ... कार्यात्मक भाषा ... vi एमुलेशन ... आपने ईमेक का पुनः आविष्कार किया है। NOOOOOOOOOOOOOOOOOOOOOOO!
बेन वोइगट

2
सिवाय इसके कि यह "प्रमाणित 100% कोष्ठक-मुक्त" है :)
पावेल मिनावे

@ फावल, पाठ्यक्रम के tuples के अलावा, और .net विधि कॉल
JaredPar

26
नोट की दो बातें यहाँ। सबसे पहले, tuples ()को F # की आवश्यकता नहीं है - ,ऑपरेटर वही है जो उन्हें बनाता है, इसलिए let x = 1,2बिना किसी परचे के पहले से ही एक मान्य tuple है। दूसरा, एफ # में किसी भी जोड़ी के पार्न्स को जोड़ी के द्वारा प्रतिस्थापित किया जा सकता है begin.. end(यह एमएल से विरासत में मिला है) - इसलिए, उदाहरण के लिए, "foo".IndexOf begin 'a', 1 endएक वैध .NET विधि कॉल है। इसलिए यदि आप कभी भी पैरेंस-फ्री होना चाहते हैं, तो F # एक ऐसी भाषा है जो आपको ऐसा करने में सक्षम बनाती है :)
Pavel Minaev

मजेदार टिप्पणी पावेल! नहीं पता था कि मुझे लगता है कि बड़े समूहीकरण ब्लॉक के साथ कुछ मामलों में, मैं वास्तव में पसंद कर सकते हैं begin.. end। ALSO: Vsvim नियम!
डैन फिच

13

एफ # विज़ुअल स्टूडियो घटकों के लिए बहुत सारे यूनिट परीक्षण एफ # में लिखे गए हैं। वे वीएस के बाहर चलाते हैं, विभिन्न दृश्य स्टूडियो बिट्स का मजाक उड़ाते हैं। अनाम वस्तुओं को नियंत्रित करने की क्षमता जो इंटरफेस को लागू करती है, एक नकली रूपरेखा / उपकरण के स्थान पर उपयोगी है। मैं सिर्फ लिख सकता हूं

let owpe : string list ref = ref []
let vsOutputWindowPane = 
    { new IVsOutputWindowPane with
        member this.Activate () = err(__LINE__)
        member this.Clear () = owpe := []; 0
        member this.FlushToTaskList () = VSConstants.S_OK
        member this.GetName(pbstrPaneName) = err(__LINE__)
        member this.Hide () = err(__LINE__)
        member this.OutputString(pszOutputString) = owpe := pszOutputString :: !owpe ; 0
        member this.OutputStringThreadSafe(pszOutputString) = owpe := pszOutputString :: !owpe ; 0
        member this.OutputTaskItemString(pszOutputString, nPriority, nCategory, pszSubcategory, nBitmap, pszFilename, nLineNum, pszTaskItemText) = err(__LINE__)
        member this.OutputTaskItemStringEx(pszOutputString, nPriority, nCategory, pszSubcategory, nBitmap, pszFilename, nLineNum, pszTaskItemText, pszLookupKwd) = err(__LINE__)
        member this.SetName(pszPaneName) = err(__LINE__)
    }            
DoSomethingThatNeedsA(vsOutputWindowPane)
assert( !owpe = expectedOutputStringList )

जब मुझे उदाहरण के IVsOutputWindowPaneलिए किसी अन्य घटक को पास करने के लिए उदाहरण की आवश्यकता होती है, जो अंततः कॉलिंग OutputStringऔर होगा Clear, और फिर string list refपरीक्षण के अंत में ऑब्जेक्ट का निरीक्षण करके यह देखने के लिए कि क्या अपेक्षित आउटपुट लिखा गया था।


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

9

हमने एफ # में लेक्स-याक के कार्यान्वयन का उपयोग करते हुए एक कस्टम नियम इंजन भाषा लिखी थी

टिप्पणी उत्तर शामिल करने के लिए संपादित करें

C # में कोई lex / yacc कार्यान्वयन नहीं था। (जहाँ तक हम जानते थे, और एफ # एक था)

यह संभव होगा, लेकिन खुद को पार्स बनाने के लिए एक ईमानदार दर्द।

यह विषय कुछ अन्य सुझावों को दिखाता है, जैसे कि बाहरी पुस्तकालय, लेकिन हमारे प्रमुख वास्तुकार कार्यात्मक भाषाओं में एक पुराने हाथ हैं, इसलिए एफ # का उपयोग करने का विकल्प एक नो-ब्रेनर था।


+1 आपने पहले C # में लिखा होगा यह एक निश्चित कारण के लिए अनुपयुक्त या धीमा था?
पीटर मैक्ग

@Peter McGrattan कम से कम लेखन (सॉफ्टवेयर) के समय, C # में कोई lex / yacc कार्यान्वयन नहीं था। यह संभव होगा, लेकिन खुद को पार्स बनाने के लिए एक ईमानदार दर्द। stackoverflow.com/questions/540593/lex-yacc-for-c कुछ अन्य सुझावों को दिखाता है, लेकिन हमारे प्रमुख वास्तुकार कार्यात्मक भाषाओं में एक पुराना हाथ है, इसलिए F # का उपयोग करने का विकल्प एक नो-
ब्रेनर था

अगर आपको लगता है कि C # के लिए कोई lex / yacc नहीं था, तो मुझे डर है कि आप बस इसके लिए पर्याप्त रूप से कठिन नहीं दिखे (F # से पुराना है) ने कहा कि अगर आपको lex / yacc की आवश्यकता है तो F # मेरी राय में बहुत बेहतर है। सी # की तुलना में उस नाखून के लिए हथौड़ा
रुस एफएस

मैंने अपने आप को fslex / fxyacc के साथ F # का उपयोग किया, हालांकि "प्रोडक्शन" प्रोजेक्ट में नहीं (अभी तक जारी नहीं किया गया है, वैसे भी) - MSIL सिंटैक्स हाइलाइटिंग और कोड पूरा करने के लिए वी.एस. एफ # का उपयोग करने का मुख्य लाभ यह है कि आपको एडीटी मिलते हैं, जो पार्स पेड़ों का प्रतिनिधित्व करने के लिए बहुत सुविधाजनक हैं। इसके अलावा, zippers ( en.wikipedia.org/wiki/Zipper_(data_structure) का उपयोग करके ) वृद्धिशील लेक्सिंग करना आसान बनाता है - और जिपर, कार्यात्मक होने के नाते, एफ # में संक्षिप्त रूप से हेरफेर करना आसान है।
पावेल मिनाएव

7

मैं वर्तमान में एक प्रोग्रामिंग भाषा के लिए एक संकलन पर काम कर रहा हूं। कंपाइलर पूरी तरह से एफ # में लिखा गया है। संकलक (लेक्स और पार्सर से अलग लेक्स / याक के साथ निर्मित) मूल रूप से संरचना जैसे जटिल पेड़ के बहुत से परिवर्तन के रूप में निर्मित होता है।

जैसा कि अन्य लोगों ने कहा है कि यूनियनों और पैटर्न के मेल से भेदभाव इस तरह की डेटा संरचना के साथ काम करना आसान बनाता है, क्योंकि वर्चुअल तरीके "सभी जगह" में कोड डंप करने की तुलना में बहुत आसान है।

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

पेड़ों के साथ काम करते हुए मुझे घोषणात्मक कोड लिखने की क्षमता मिलती है, जिसमें एफपी (एफ # शामिल) का मुख्य लाभ होता है, जिसमें एल्गोरिथ्म का वर्णन होता है, जिसमें सी # के विपरीत लागू करने की कोशिश की जाती है, जिसमें यह वर्णन किया गया है कि मैंने कैसे एलगॉर्टिहैम को लागू किया है, यह एक बहुत बड़ा लाभ है।


6

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


5

मुझे नहीं पता कि यह उत्पादन में है, लेकिन "द पाथ ऑफ गो" के लिए एआई को एफ # में लिखा गया था:

http://research.microsoft.com/en-us/events/techvista2010/demolist.aspx#ThePathofGo

जाने का रास्ता: Xbox 360 के लिए एक Microsoft अनुसंधान गेम

यह डेमो Microsoft अनुसंधान कैम्ब्रिज में निर्मित इन-गो के खेल पर आधारित एक Xbox 360 गेम को प्रदर्शित करता है। पूर्वी एशिया में गो सबसे प्रसिद्ध बोर्ड गेम में से एक है, इसकी उत्पत्ति 4000 साल पहले चीन में हुई थी। खेल की भ्रामक सादगी के पीछे बड़ी जटिलता छिपती है। इसे सीखने में केवल मिनट लगते हैं, लेकिन इसमें जीवन भर का समय लगता है। यद्यपि कंप्यूटरों ने शतरंज में मानव कौशल को पार कर लिया है, गो के लिए प्रतिस्पर्धी AI को लागू करना एक शोध चुनौती है। यह गेम माइक्रोसॉफ्ट रिसर्च कैम्ब्रिज में विकसित तीन तकनीकों द्वारा संचालित है: ऑनलाइन खिलाड़ियों से मिलान करने के लिए गो, एफ # भाषा और ट्रूस्किल ™ खेलने में सक्षम एआई। AI F # में लागू किया गया है और Xbox 360 पर .net कॉम्पैक्ट फ्रेमवर्क में कुशलता से चलने की चुनौती को पूरा करता है। यह गेम आपको नेत्रहीन तेजस्वी 3 डी दृश्यों की संख्या में रखता है। यह XNA वातावरण का उपयोग करके प्रबंधित कोड में पूरी तरह से विकसित किया गया था।

(किसी और ने "ट्रूस्किल" का पहले ही उल्लेख किया है।)


Fascinating: F # XBox पर कॉम्पैक्ट फ्रेमवर्क पर चल रहा है। FSharp.Core.dll FSharp.Core.optdata FSharp.Core.sigdata संदर्भ गैर-सीएफ असेंबली के साथ नहीं है?
पीटर मैक्

1
CTP जहाजों को एक अलग FSharp.Core के साथ बनाया जाता है जो .NETCF के लिए निर्मित होता है। (सिल्वरलाइट के लिए एक अलग FSharp.Core भी है।)
ब्रायन

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