F # परिवर्तन OCaml [बंद]


126

F # OCaml से लिया गया है, लेकिन कौन सी प्रमुख वस्तुएं गायब हैं या जोड़ी गई हैं? विशेष रूप से मुझे इस बात की उत्सुकता है कि क्या OCaml सीखने के लिए उपलब्ध संसाधन किसी ऐसे व्यक्ति के लिए भी उपयोगी हैं जो F # सीखना चाहते हैं।


3
एक OCaml डेवलपर के दृष्टिकोण से एक और तुलना तो यह काफी पक्षपाती है, लेकिन फिर भी उपयोगी नहीं है।
मौरिसियो शेफ़र

8
ध्यान दें: यदि आप इस प्रश्न के भाग्य में रुचि रखते हैं, तो कृपया मेटा स्टैक ओवरफ्लो पर चर्चा में शामिल हों या चैट में चर्चा करें - यहां की टिप्पणियां असाधारण रूप से अनुत्पादक थीं, इसलिए मैंने उन्हें हटा दिया है।
शोग

1
@MauricioScheffer टूटी हुई कड़ी!
जद

2
@JonHarrop मुझे लगता है कि यह लिंक अपडेटेड हो सकता है। (कीको नाकाटा द्वारा)
बार्ट

जवाबों:


89

मुख्य अंतर यह है कि F # समर्थन नहीं करता है:

  • functors
  • OCaml- शैली वस्तुओं
  • बहुरूपी प्रकार
  • camlp4 / 5 प्रीप्रोसेसर या एक्सटेंशन पॉइंट्स (ppx)

इसके अलावा, एफ # में लेबल और वैकल्पिक मापदंडों के लिए एक अलग वाक्यविन्यास है।

सिद्धांत रूप में, OCaml प्रोग्राम जो इन सुविधाओं का उपयोग नहीं करते हैं, उन्हें F # के साथ संकलित किया जा सकता है। OCaml सीखना F # (और इसके विपरीत, मुझे लगता है) के लिए एक पूरी तरह से उचित परिचय है।

मतभेदों की पूरी सूची यहां है (नोट: आर्काइव। डेड लिंक के प्रतिस्थापन)।


3
क्या F # के लिए एक समान है?
20uc में nlucaroni

ऐसा मत सोचो। लेकिन आप अपने प्रोग्राम को camlp4 के माध्यम से और F # कंपाइलर में, शायद कर सकते हैं। (इसकी अनुशंसा नहीं करेंगे।)
क्रिस कॉनवे

6
एफ # में नाम और वैकल्पिक तर्क हैं लेकिन यह एक अलग वाक्यविन्यास और शब्दार्थ का उपयोग करता है। आपको F # के साथ Camlp4 का उपयोग करने में परेशानी होगी क्योंकि F # लगभग हमेशा इंडेंटेशन सेंसिटिव होता है इसलिए इसे एक नए लेसर की आवश्यकता होगी और Lexers पर Camlp4 प्रलेखन लगभग दो वर्षों तक अलिखित रहा है।
JD

4
और अब लिंक मर चुका है। मुझे लगता है कि यह शायद अच्छा है। मुझे यकीन है कि F0 '08 के बाद से सुधार हुआ है।

1
मैंने कहीं सुना है कि Microsoft F # के लिए camlp4 जैसी कार्यक्षमता नहीं जोड़ना चाहता था क्योंकि वे चिंतित थे कि इस तरह की कार्यक्षमता लोगों को Microsoft Visual Studio के अलावा अन्य विकास वातावरण का उपयोग शुरू करने के लिए प्रोत्साहित कर सकती है।
chrismamo1

118

इस प्रश्न का उत्तर कुछ समय के लिए दिया गया है, लेकिन मुझे काफी आश्चर्य हुआ कि अधिकांश उत्तर कहते हैं कि OCaml के फीचर्स F # में क्या गायब हैं - यह जानना निश्चित रूप से अच्छा है कि क्या आप मौजूदा OCaml प्रोग्रामों को F # (जो शायद है) में पोर्ट करना चाहते हैं अधिकांश संदर्भित लेखों की प्रेरणा)। हालाँकि, कई विशेषताएं हैं जो F # को एक अलग भाषा बनाती हैं (न कि .NET के लिए OCaml का केवल एक सीमित संस्करण!) यहाँ F # में कुछ चीज़ें जोड़ी गई हैं:

  • माप की इकाइयाँ जो आपको संख्यात्मक गणनाओं से निपटने वाले कोड को टाइप करने की अनुमति देती हैं
  • कोटेशन का उपयोग करके मेटा-प्रोग्रामिंग (जो एफ # में LINQ का उपयोग करना संभव बनाता है और यह वेबसर्पर प्लेटफॉर्म जैसी परियोजनाओं को बढ़ावा देने के लिए भी आवश्यक है)
  • कार्यात्मक डेटा प्रकारों के लिए सार बनाने के लिए सक्रिय पैटर्न (और अधिक जटिल पैटर्न मिलान अनुप्रयोगों के लिए आमतौर पर बहुत उपयोगी सुविधा)
  • अभिकलन अभिव्यक्तियाँ जो अतुल्यकालिक वर्कफ़्लोज़ (असिंक्रोनस I / O / वेब सेवा / GUI प्रोग्रामिंग के लिए लाइब्रेरी) के पीछे एक भाषा सुविधा है
  • .NET संगत ऑब्जेक्ट-सिस्टम जो .NET प्लेटफ़ॉर्म के साथ पूरी तरह से इंटरॉपर्टेट करना संभव बनाता है (OCaml में ऑब्जेक्ट्स के लिए समर्थन भी है लेकिन अलग-अलग - दोनों सिस्टम में निश्चित रूप से कुछ लाभ हैं)।
  • ओवरलोडेड ऑपरेटर - जहाँ तक मुझे पता है, OCaml के पास ओवरलोडेड ऑपरेटर नहीं हैं - F # में आप +सभी न्यूमेरिक प्रकारों के साथ-साथ अपने प्रकारों का भी उपयोग कर सकते हैं जो इसका समर्थन करते हैं।

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

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


18
ओह! OCaml को विशेष रूप से मेटाप्रोग्रामिंग के लिए तैयार किया गया था, यह उस संदर्भ में F # और .NET से काफी बेहतर है। Camlp4 F # की तुलना में कहीं अधिक शक्तिशाली उद्धरण प्रणाली है। OCaml के lexers और parsers .NET के लिए उपलब्ध किसी भी चीज़ से बेहतर हैं। इसके अलावा, Camlp4 मैक्रोज़ उपलब्ध हैं जो सक्रिय पैटर्न और अभिकलन अभिव्यक्ति को लागू करते हैं। OCaml में IDE भी हैं जो वही लाभ प्रदान करते हैं जो विज़ुअल स्टूडियो F # के लिए करता है।
जेडी

4
F # कोटेशन Camlp4 में उपलब्ध है की तुलना में पूरी तरह से अलग लक्ष्य है (एक तरफ, यह OCaml भाषा नहीं है - यह इसके शीर्ष पर एक प्रणाली है), इसलिए उनकी तुलना करना उचित नहीं है। Camlp4 का अस्तित्व निश्चित रूप से OCaml का एक फायदा है, लेकिन इसका उद्धरणों से कोई लेना-देना नहीं है (कि WebSharper जैसी चीजों की अनुमति दें, GPU पर F # चलाना)
टॉमस पेट्रीसेक

12
@ टॉमा: आप अपने दावे को कैसे समेटते हैं कि Camlp4 "OCaml के शीर्ष पर एक सिस्टम है जब Camlp4 को बाइनरी स्तर पर OCaml के साथ एकीकृत किया जाता है और Camlp4 मैक्रोज़ को परिभाषित किया जा सकता है और एक चल रहे OCaml REPL में उपयोग किया जा सकता है?" आप अपने दावे को कैसे समेटते हैं कि Camlp4 का "उद्धरणों से कोई लेना-देना नहीं है" इस तथ्य के साथ कि Camlp4 एक उद्धरण तंत्र प्रदान करता है? जब आप स्काईडेक के ओकलम उपकरण 2007 से कैमकाले 4 को जावास्क्रिप्ट का उपयोग करते हुए ओकेएमएल कोड का संकलन कर रहे हैं, तो कैमलप 4 वेबशर की पसंद को सुगम नहीं कर सकता है, तो आप अपने निहितार्थ को कैसे समझ सकते हैं?
JD

6
@ टोमस: एफ # भी अनबाउंड वैरिएबल्स के साथ भावों को उद्धृत नहीं कर सकता है <@ a @>, जैसे अकेले टाइप परिभाषाएं दें <@ type t = int @>और यह मनमाना व्याकरणों को बहुत कम एक्स्टेंसिबल लेक्सर्स और पार्सर्स को हैंडल नहीं कर सकता जैसा कि कैमलप 4 करता है। एक सभ्य मैक्रो सिस्टम की कमी एक कमी है लेकिन, IMHO, F # के लिए किसी भी सभ्य लेक्सर्स और पार्सर्स की कमी कहीं अधिक गंभीर बाधा है। मैं वास्तव में OCaml का उपयोग करके अपने लेक्सर्स और पर्सर्स बनाने के लिए डेवलपर्स को सलाह देता हूं, खुद को उस सबसेट तक सीमित कर देता हूं जो OCaml के बेहतर टूल सपोर्ट से लाभान्वित करने के लिए F # समर्थन करता है और इसे F # में पोर्ट करता है!
JD

8
@ एरिक: "ज्यादातर लोग F # से गायब होने पर ध्यान केंद्रित करते हैं, लेकिन मैं यह भी देखना चाहता था कि OCaml से क्या गायब था"। ध्यान दें कि सक्रिय पैटर्न, मेटाप्रोग्रामिंग, कम्प्यूटेशन एक्सप्रेशन और एसिंक्रोनस वर्कफ़्लोज़ OCaml में उपलब्ध थे, क्योंकि उन्होंने इसे F # में बनाया था।
JD

16

मैं हमेशा F # को OCaml के चचेरे भाई के रूप में वर्णित करता हूं क्योंकि OCaml में कई विशेषताएं हैं जो F # के पास नहीं है और कभी भी प्राप्त होने की संभावना नहीं है। F # पिछले CAML भाषा से अधिक निकटता से संबंधित है। विशेष रूप से, एफ # में अमूर्तता के लिए बहुत सीमित समर्थन है और संरचनात्मक टाइपिंग के लिए कोई समर्थन नहीं है (जैसे ओकेएमएल की वस्तुएं और बहुरूपी संस्करण )।

कुछ उत्तरदाताओं ने जो लिखा है, उसके विपरीत, एफ # में लेबल ("नाम") और वैकल्पिक तर्कों के लिए (सीमित) समर्थन है।

हालाँकि, ये सभी उन्नत सुविधाएँ हैं और आप निश्चित रूप से OCaml के बारे में संसाधनों का उपयोग करके छोटे पैमाने पर OCaml- शैली की फंक्शनल प्रोग्रामिंग के पीछे मूल विचारों के साथ पकड़ना शुरू कर सकते हैं। पहला बड़ा अंतर जो आपको पता चलेगा कि बड़े पैमाने पर समस्याएं हैं जैसे एनकैप्सुलेशन और एब्स्ट्रैक्शन जो कि पूरी तरह से OCaml और F # में अलग-अलग तरीकों से हल होते हैं। यदि आप सीखना चाहते हैं कि एफ # में ऐसा कैसे करें, तो केवल उपलब्ध साहित्य विशुद्ध रूप से कार्यात्मक डेटा संरचनाओं पर यह लेख है

मुझे यह भी पता चला है कि OCaml का अद्भुत मॉड्यूल सिस्टम कोड को प्रकारों (जैसे डेटा स्ट्रक्चर्स) पर पैरामीटर बनाना आसान बनाता है, लेकिन OOP विकल्प न केवल छिपे हुए हैं बल्कि .NET पर लगभग पूरी तरह से अप्रयुक्त हैं। इसके अलावा, जब सुरुचिपूर्ण ढंग से पैरामीटर डेटा संरचना लिखने की कोशिश कर रहा हूं तो मैंने एफ # संकलक में दर्जनों बग मार दिए क्योंकि किसी ने भी ऐसा करने का प्रयास नहीं किया है। F # stdlib में कुछ अच्छे डेटा संरचना कार्यान्वयन शामिल हैं, लेकिन वस्तुतः कोई पुन: उपयोग नहीं होता है, अर्थात यह एक cut'n'paste कार्य है।


28
सभी लिंक के लिए सब्सक्रिप्शन की आवश्यकता है।

2
जॉन ने कहा कि जॉन हेरोप ने खुद के लिए बेशर्म प्लग लगाये हैं (वह हर बार लेखक के रूप में सूचीबद्ध होते हैं)
सहसंबंधी

@symbiont हाँ, हम इसके बारे में जानते हैं। अच्छा होगा यदि आप कुछ अतिरिक्त जानकारी से जुड़े हैं जो मुफ़्त थी। लेकिन लिंक के बिना उत्तर ठीक है, इसलिए आप वहां हैं।

@ अगर आप कुछ अतिरिक्त जानकारी खुद से जोड़ते हैं तो अच्छा लगेगा
सिम्बियन

@symbiont का मतलब था मैं, जो नहीं, जब मैंने "तुम" कहा। अजीब लगता है, इसे पढ़कर। यकीन नहीं होता अगर जॉन ने एक अंतरिम टिप्पणी को हटा दिया। किसी भी तरह, यहां आप जाएं: मेटा स्टैक एक्सचेंज

9

एफ # और ओकेएमएल भाषाओं के एमएल परिवार में टैक्सोनिमिक रूप से कक्षाएं हैं, जिसमें अन्य अजीब जानवरों का एक पूरा पास भी शामिल है। F # OCaml की तुलना में नया है, और इसमें या तो फंक्शनलर्स [मॉड्यूल के कार्य -> ​​मॉड्यूल] या पंक्ति प्रकार [ऑब्जेक्ट क्लास और पॉलीमॉर्फिक वेरिएंट] नहीं हैं। उन दोनों के बीच, वे दो सरलीकरण संभवत: .Net प्लेटफॉर्म पर विकसित करने वाले किसी व्यक्ति के लिए सीखने की अवस्था को आसान बनाते हैं। अफसोस की बात है कि उन दो भाषा सुविधाएँ ओमेक्एल में बेहद शक्तिशाली हैं, इसलिए एफ # कोड के लिए अंतर्दृष्टि प्राप्त करने के लिए ओकेएमएल साहित्य को पढ़ने से संभवतः बाद में समय के साथ निराशा पैदा होगी जब यह संभवतः सी # के लिए एक उत्कृष्ट विकल्प होगा, जहां दोनों उपलब्ध हैं।


2

F # सीधे OCaml सिंटैक्स का समर्थन करता है। यह 100% संगत नहीं हो सकता है, लेकिन मुझे लगता है कि यह बहुत करीब है।

http://plus.kaist.ac.kr/~shoh/fsharp/html/index.html

यहां अंतरों की एक सूची दी गई है (यह सुनिश्चित नहीं है कि यह कैसे अप-टू-डेट है)

http://plus.kaist.ac.kr/~shoh/fsharp/html/fsharp-vs-ocaml.html


1
"एफ # सीधे OCaml सिंटैक्स का समर्थन करता है। यह 100% संगत नहीं हो सकता है, लेकिन मुझे लगता है कि यह बहुत करीब है"। OCaml संगतता के लिए IME F # संकलक का समर्थन बहुत छोटी गाड़ी है। इससे मौजूदा OCaml कोड बेस को F # पोर्ट करना मुश्किल हो सकता है क्योंकि F # कंपाइलर आंतरिक रूप से मान्य कोड पर मर जाता है।
JD

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