हास्केल और एफ # के बीच प्राथमिक अंतर क्या हैं? [बन्द है]


135

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


1
F # के बारे में अच्छी बात यह है कि इसके मिश्रित प्रतिमान के कारण यह OO प्रोग्रामर के लिए एक बेहतर शुरुआती बिंदु प्रदान करता है। वह धीरे-धीरे कार्यात्मक सोच के साथ गति में आ सकता है और अभी भी परिचित ओओ पुस्तकालयों का उपयोग करके वापस आ सकता है क्योंकि वह सी # में होगा। हास्केल आप सभी को एक ही बार में पूरे कार्यात्मक enchilada मजबूर करता है।
मारियो

यह ध्यान रखना महत्वपूर्ण है कि एफ # एक कार्यात्मक प्रोग्रामिंग भाषा नहीं है। हालांकि एफपी से यह काफी हद तक अपनाया गया है, इसलिए संभव है कि शायद कई समानताएं मिलें, लेकिन फिर भी मुख्य रूप से मैं कहूंगा कि वे पूरी तरह से अलग भाषाएं हैं।
4

जवाबों:


128

हास्केल एक "शुद्ध" कार्यात्मक भाषा है, जहां एफ # में अनिवार्य / ओओ और कार्यात्मक भाषाओं दोनों के पहलू हैं। हास्केल में आलसी मूल्यांकन भी है, जो कार्यात्मक भाषाओं के बीच काफी दुर्लभ है।

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

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

आलसी मूल्यांकन वह जगह है जहां किसी फ़ंक्शन का मूल्यांकन नहीं किया जाता है जब तक कि यह बिल्कुल आवश्यक न हो। इसका मतलब है कि जब आवश्यक नहीं तो कई ऑपरेशन टाले जा सकते हैं। मूल सी # में इस बारे में सोचें यदि क्लॉज इस तरह है:

if(IsSomethingTrue() && AnotherThingTrue())
{
    do something;
}

यदि IsSomethingTrue()झूठ है तो AnotherThingTrue()विधि का मूल्यांकन कभी नहीं किया जाता है।

जबकि हास्केल एक अद्भुत भाषा है, एफ # का प्रमुख लाभ (समय के लिए), यह है कि यह सीएलआर के शीर्ष पर बैठता है। यह स्वयं को पॉलीग्लॉट प्रोग्रामिंग के लिए उधार देता है। एक दिन, आप ASP.net MVC में अपना वेब UI, C # में अपने व्यावसायिक तर्क, F # में अपने मुख्य एल्गोरिदम और Ironruby में अपनी इकाई परीक्षण लिख सकते हैं। सभी .Net ढांचे के बीच।

हस्केल के बारे में अधिक जानकारी के लिए साइमन पेयटन जोन्स के साथ सॉफ्टवेयर इंजीनियरिंग रेडियो को सुनिए: एपिसोड 108: कार्यात्मक प्रोग्रामिंग और हास्केल पर साइमन पेटन जोन्स


8
F # का एक और संभावित प्रमुख लाभ (स्थिति के आधार पर) यह है कि यह आलसी नहीं है, जिसका अर्थ है कि अंतरिक्ष-समय के व्यवहार के बारे में तर्क के लिए सीखने की अवस्था वस्तुतः सभी के लिए बहुत सरल होगी।
cjs

5
सी-रेडियो एपिसोड 108 (साइमन पेटन जोन्स) से सीधा लिंक: se-radio.net/podcast/2008-08/…
Herrmann

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

12
@ जोनरहॉप: यह एल्गोरिदम के बारे में एक बयान है, जो संकलक अनुकूलन की प्रयोज्यता से संबंधित है। लागू पवित्रता की भाषाएं आमतौर पर आपको स्पष्ट रूप से अशुद्ध कोड लिखने की अनुमति देती हैं, यदि आपको वास्तव में (यदि एफएफआई का उपयोग करने के लिए कॉल करने के लिए और कुछ नहीं तो) की आवश्यकता है। कंपाइलर कोड परिवर्तनों को तब और अधिक स्वतंत्र रूप से लागू कर सकता है जब यह (अज्ञात) साइड इफेक्ट्स के आदेश को संरक्षित करने के लिए बाध्य नहीं है। "प्रोत्साहित शुद्धता" भाषाओं में आप ज्यादातर समान कोड लिखते हैं इसलिए समान अनुकूलन लागू होंगे, केवल वे साइड इफेक्ट्स को अमान्य कर सकते हैं (जो कि नहीं हैं, लेकिन कंपाइलर मान नहीं सकते हैं)।
बेन

3
@JonHarrop मैंने कब दावा किया कि वे सभी एल्गोरिदम थे? किसी भी मामले में, हम हास्केल और एफ # की तुलना कर रहे हैं, हास्केल और सी। एफ # एक "प्रोत्साहित शुद्धता" भाषा नहीं है, इसलिए आप अक्सर शुद्ध कोड लिखते हैं। सभी मैं यह दावा कर रहा हूं कि "समान रूप से लागू शुद्धता" सेटिंग में कंपाइलर द्वारा सटीक समान कोड को अक्सर बेहतर तरीके से अनुकूलित किया जा सकता है, क्योंकि F # कंपाइलर को यह मानना ​​पड़ता है कि कॉल के साइड इफेक्ट्स हैं। आप एक अलग एल्गोरिथ्म (जो साइड इफेक्ट्स पर निर्भर करता है) का उपयोग करने के लिए कोड को फिर से लिखने के बारे में बात कर रहे हैं; मैं एफ # बनाम हास्केल में शुद्ध कोड की "अनुकूलनशीलता" के बारे में ले रहा हूं।
बेन

53

बड़े अंतर:

  • मंच
  • वस्तु अभिविन्यास
  • आलस्य

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

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

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

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

मामूली अंतर:

  • सिंटैक्स: हास्केल ने मेरी राय में थोड़ा अच्छा सिंटैक्स है। यह थोड़ा और अधिक नियमित और नियमित है, और मुझे एक अलग लाइन पर प्रकार की घोषणा करना पसंद है। YMMV।
  • उपकरण: यदि आप उस तरह की चीज़ों को पसंद करते हैं, तो F # में उत्कृष्ट Visual Studio एकीकरण है। हास्केल में एक पुराना विज़ुअल स्टूडियो प्लगइन भी है , लेकिन मुझे नहीं लगता कि यह कभी बीटा से बाहर निकला है। हास्केल में एक सरल emacs मोड है, और आप शायद F # को संपादित करने के लिए OCaml के tuareg-mode का उपयोग कर सकते हैं ।
  • साइड इफेक्ट्स: जब आप वेरिएबल को म्यूट कर रहे होते हैं, तो दोनों ही भाषाएं बहुत स्पष्ट होती हैं। लेकिन हास्केल के कंपाइलर आपको साइड इफेक्ट्स को चिह्नित करने के लिए भी मजबूर करते हैं जब भी आप उनका उपयोग करते हैं। व्यावहारिक अंतर यह है कि जब आप पुस्तकालयों का उपयोग साइड इफेक्ट के साथ करते हैं तो आपको बहुत अधिक जागरूक होना पड़ता है।

1
प्रदर्शन के लिए देखें । यह निश्चित नहीं है कि यह कितना
वैध

35

F # भाषाओं के ML परिवार का हिस्सा है और OCaml के बहुत करीब है। आप हास्केल और ओकेमेल के बीच के अंतर पर इस चर्चा को पढ़ना चाह सकते हैं ।


6
हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं। - समीक्षा से
mirabilos

33

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

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

दुर्भाग्य से, इस तरह की जगह में कोई रास्ता नहीं है कि आप यह समझने के लिए पर्याप्त समझ प्रदान करें कि अंतर क्या है। वास्तव में, लेखन की कोई भी राशि ऐसा नहीं करेगी; आपको बस एक वास्तविक समझ हासिल करने के लिए सीखने और लिखने के लिए पर्याप्त समय बिताना होगा।

साथ ही, F # कभी-कभी .NET प्लेटफॉर्म / पुस्तकालयों के साथ इंटरफेस करते समय थोड़ा कम कार्यात्मक या अधिक अजीब (कार्यात्मक प्रोग्रामिंग दृष्टिकोण से) बन सकता है, क्योंकि पुस्तकालयों को स्पष्ट रूप से एक ओओ बिंदु से डिजाइन किया गया था।

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

अन्य असंबंधित बिंदुओं की एक जोड़ी:

हास्केल के पास थोड़ा अच्छा सिंटैक्स है, जो कि कोई आश्चर्य की बात नहीं है, क्योंकि हास्केल के डिजाइनर एमएल को अच्छी तरह से जानते थे। हालाँकि, F # 's' लाइट 'सिंटैक्स ML सिंटैक्स को बेहतर बनाने की दिशा में एक लंबा रास्ता तय करता है, इसलिए वहाँ कोई बहुत बड़ा अंतर नहीं है।

प्लेटफार्मों के संदर्भ में, F # बेशक .NET का है; कितना अच्छा है कि मोनो पर काम करेंगे मुझे नहीं पता। जीएचसी अपने स्वयं के रनटाइम के साथ मशीन कोड को संकलित करता है, जो विंडोज और यूनिक्स दोनों के तहत अच्छी तरह से काम करता है, जो .NET की तुलना उसी तरह से करता है, जैसे कि, C ++ करता है। यह कुछ परिस्थितियों में एक फायदा हो सकता है, खासकर गति और निचले स्तर की मशीन पहुंच के संदर्भ में। (उदाहरण के लिए, हास्केल / जीएचसी में एक डीडीई सर्वर लिखने में मुझे कोई समस्या नहीं थी; मुझे नहीं लगता कि आप ऐसा किसी भी .NET भाषा में कर सकते हैं, और इसकी परवाह किए बिना, एमएस निश्चित रूप से आप ऐसा नहीं करना चाहते हैं।)


2

खैर, मैं एक मुख्य लाभ के लिए कहूंगा कि F # .NET प्लेटफॉर्म के खिलाफ संकलन करता है जो विंडोज़ पर तैनात करना आसान बनाता है। मैंने ऐसे उदाहरण देखे हैं, जिन्होंने वेब अनुप्रयोगों के निर्माण के लिए ASP.NET के साथ मिलकर F # का उपयोग करके समझाया; ;-)

दूसरी ओर, हास्केल लंबे समय तक वायाए के आसपास रहे हैं, इसलिए मुझे लगता है कि उन लोगों का समूह जो उस भाषा के वास्तविक विशेषज्ञ हैं, बहुत बड़ा है।

F # के लिए मैंने अब तक केवल एक वास्तविक कार्यान्वयन देखा है, जो कि अवधारणा OS का विलक्षणता प्रमाण है। मैंने हास्केल के अधिक वास्तविक विश्व कार्यान्वयन को देखा है।


4
एफ # में पहले से ही कई प्रमुख सफलता की कहानियां (हेलो 3, एडेंटर, एफ # विज़ुअलाइज़ेशन के लिए) हैं जो निकटतम चीज़ हैस्सेल को एक सफलता की कहानी (डार्क्स) है।
JD

इस बात की ओर इशारा करते हुए कि इसके लिए नकारात्मक पहलू हैं। (सीएलआर सीमाएँ)
१४:१४ पर मास्टरमैस्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.