क्या हास्केल के साथ कोई डाउनसाइड या समस्याएं हैं?


47

मैं अपने अगले (अपेक्षाकृत तुच्छ) निजी प्रोजेक्ट के लिए हास्केल में गोताखोरी कर रहा हूं। हास्केल से निपटने के कारण हैं:

  1. विशुद्ध रूप से कार्यात्मक भाषा में मेरे सिर जाओ
  2. स्पीड। हालांकि मुझे यकीन है कि यह तर्क दिया जा सकता है, प्रोफाइलिंग कि मैंने नाखून हास्केल को C ++ के करीब देखा है (और लगता है कि एरलांग की तुलना में काफी तेज है)।
  3. स्पीड। लगभग सभी चीज़ों की तुलना में Warp web server काफी तेज़ी से पागल होता है

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

मैं जिस चीज की तलाश कर रहा हूं उसका एक उदाहरण पायथन की जीआईएल जैसा हो सकता है। जब तक मैं वास्तव में एक CPython वातावरण में संगामिति का उपयोग करना शुरू नहीं करता तब तक उसके सिर को पीछे नहीं किया।


4
स्टैकओवरफ्लो पर यह मिला: stackoverflow.com/questions/1695076/pros-and-cons-of-haskell
FrustratedWithFormsDesigner

26
मैंने सुना है कम प्रोग्रामर मस्तिष्क के पिघलने के मुद्दों से निपट चुके हैं। यह इलाज करने के लिए एक बहुत महंगी शर्त है।
चोसपांडियन

1
@FrustratedWithFormsDesigner: लिंक के लिए धन्यवाद। हालांकि, वहाँ अभी भी हैस्केल के लिए किसी भी तकनीकी downsides के लिए कोई संदर्भ नहीं है .. क्या यह हो सकता है कोई भी नहीं है ? ;)
डेमियन ब्रेख्त

6
@ChaosPandion: मैंने वही सुना है .. लेकिन अगर आप अपना दिमाग नहीं पिघला रहे हैं, तो क्या आप वास्तव में कोशिश कर रहे हैं ? ;) इसके अलावा, मैं वास्तव में अपने आप को एक कम प्रोग्रामर का संबंध नहीं होगा, इसलिए मैं उस बारे में अत्यधिक चिंतित नहीं हूं;)
डेमियन ब्रेख्त

3
@ पेटोसपांडियन: और अधिकांश स्वास्थ्य योजनाएं इसे कवर नहीं करती हैं। :(
फ्रस्ट्रेटेडविथफॉर्म्सडिजेनर

जवाबों:


48

कुछ डाउनसाइड मैं सोच सकता हूं:

  • अकादमिक दुनिया में भाषा की प्रकृति और इसकी दृढ़ जड़ों के कारण, समुदाय बहुत गणित-दिमाग है; यदि आप एक व्यावहारिक व्यक्ति हैं, तो यह कई बार भारी पड़ सकता है, और यदि आप शब्दजाल नहीं बोलते हैं, तो आपके पास कई अन्य भाषाओं की तुलना में कठिन समय होगा।
  • हालांकि पुस्तकालयों की एक अविश्वसनीय संपत्ति है, प्रलेखन अक्सर कठिन है।
  • कोमल प्रवेश स्तर के ट्यूटोरियल कुछ कठिन और कठिन हैं, इसलिए प्रारंभिक सीखने की अवस्था बहुत कठिन है।
  • कुछ भाषा सुविधाएँ अनावश्यक रूप से अनाड़ी हैं; एक प्रमुख उदाहरण यह है कि रिकॉर्ड सिंटैक्स एक नामकरण क्षेत्र का परिचय कैसे नहीं देता है, इसलिए समान मॉड्यूल नेमस्पेस के भीतर दो अलग-अलग प्रकारों में एक ही रिकॉर्ड फ़ील्ड नाम रखने का कोई तरीका नहीं है।
  • हस्केल आलसी मूल्यांकन के लिए चूकता है, और जबकि यह अक्सर एक महान चीज होती है, यह कभी-कभी आपको खराब तरीके से काट सकती है। गैर-तुच्छ परिस्थितियों में लापरवाही से आलसी मूल्यांकन का उपयोग करने से अनावश्यक प्रदर्शन में अड़चन हो सकती है, और यह समझना कि हुड के नीचे क्या चल रहा है, बिल्कुल सीधा नहीं है।
  • आलसी मूल्यांकन (विशेष रूप से शुद्धता और एक आक्रामक रूप से अनुकूलन करने वाले संकलक के साथ संयुक्त) का मतलब यह भी है कि आप आसानी से निष्पादन आदेश के बारे में कारण नहीं कर सकते हैं; वास्तव में, आप यह भी नहीं जानते हैं कि एक निश्चित स्थिति में कोड का एक निश्चित टुकड़ा वास्तव में मूल्यांकन किया जाता है या नहीं। नतीजतन, हास्केल कोड को डिबग करना एक अलग मानसिकता की आवश्यकता है, अगर केवल इसलिए कि आपके कोड के माध्यम से कदम रखना कम उपयोगी और कम सार्थक है।
  • हास्केल की शुद्धता के कारण, आप I / O जैसी चीजों को करने के लिए दुष्प्रभावों का उपयोग नहीं कर सकते हैं; अन्तरक्रियाशीलता प्राप्त करने के लिए आपको एक सनक और 'दुरुपयोग' के आलसी मूल्यांकन का उपयोग करना होगा, और आपको कहीं भी आप को I / O करने की इच्छा हो सकती है। (यह वास्तव में कई मायनों में एक अच्छी विशेषता है, लेकिन यह कई बार व्यावहारिक कोडिंग को असंभव बना देता है।)

16
वहाँ वास्तव में कुछ बहुत अच्छा परिचयात्मक किताबें अब मुफ्त ऑनलाइन के लिए उपलब्ध हैं। लर्न यू हास्केल फॉर ग्रेट गुड , मैंने अब तक पढ़ी गई सबसे अच्छी शुरुआती प्रोग्रामिंग पुस्तकों में से एक है और रियल वर्ल्ड हास्केल एक महान मध्यवर्ती संसाधन है।
तिखन जेल्विस

1
@TikhonJelvis: वे वास्तव में केवल दो उम्मीदवार हैं जिन्हें मैंने उपयोग करने लायक पाया; "लर्न यू ए हास्केल" ने मुझे कुछ ज्यादा ही भ्रमित कर दिया, "रियल वर्ल्ड हास्केल" ने मेरे लिए काम किया लेकिन एक प्रोग्रामिंग पृष्ठभूमि का एक सा मान लिया। "हास्केल के लिए कोमल परिचय" भी है, लेकिन यह सब लेकिन कोमल है, खासकर यदि आपके पास मैथ में पृष्ठभूमि की कमी है।
तदमर्स

मैं "हास्केल के लिए कोमल परिचय" और "रियल वर्ल्ड हास्केल" का उपयोग करता हूं। दोनों के संयोजन ने मुझे बहुत सारी उपयोगी जानकारी दी। मैं एक ऐसे स्तर पर हूं जहां मैं एक गैर-तुच्छ परियोजना के लिए तैयार हूं, लेकिन दुर्भाग्य से मेरे पास इसके लिए ज्यादा समय नहीं है।
जियोर्जियो

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

मोनाड एक सख्त भाषा में सटीक काम करते हैं (और अन्य भाषाओं में)। आप पूरी तरह से अन्तरक्रियाशीलता प्राप्त करने के लिए आलसी मूल्यांकन का "दुरुपयोग" नहीं करते हैं, हास्केल में एक सख्त इंटरैक्टिव कार्यक्रम लिखना तुच्छ है।
अर्धविराम

19

हास्केल के अधिकांश डाउनसाइड्स (साथ ही साथ हास्केल के अधिकांश ऊपर) इसकी दो परिभाषित विशेषताओं से आते हैं: यह आलसी और विशुद्ध रूप से कार्यात्मक है।

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

आलस्य का अर्थ यह भी है कि मानदंड जैसे पुस्तकालयों का उपयोग किए बिना सटीक बेंचमार्क बनाना कठिन है।

विशुद्ध रूप से कार्यात्मक होने का मतलब है कि जब भी आपको परिवर्तनशील डेटा संरचनाओं का उपयोग करने की आवश्यकता होती है (उन मामलों में जहां उनके बिना वांछित प्रदर्शन को प्राप्त करना संभव नहीं है - हालांकि जीएचसी के ऑप्टिमाइज़र के लिए धन्यवाद जो कि जितनी बार आप सोचते हैं उतनी बार नहीं होता है), आप होंगे। IO (या ST) मोनाड में अटक जाता है, जिससे कोड अधिक बोझिल हो जाता है।

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


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

21
"और हाथ से अनुकूलित हास्केल कोड अक्सर काफी बदसूरत होता है (हालांकि मुझे लगता है कि यह अन्य भाषाओं में भी सच है)।" इस। जब लोग हास्केल की शान दिखाना चाहते हैं, तो वे लघु और मीठे कोड प्रकाशित करते हैं, जो दुर्भाग्य से आपको उत्पादन की तरह डेटा की मात्रा पर चलने पर काफी खराब प्रदर्शन देंगे। जब लोग यह दिखाना चाहते हैं कि "हास्केल सी ++ की तरह तेज है", तो वे कोड को पढ़ने के लिए जटिल और कठिन प्रकाशित करते हैं, जो अभी भी सी में बहुत अधिक पठनीय संस्करण की तुलना में धीमा है
क्वांट_देव

12

मैं हास्केल विशेषज्ञ नहीं हूं: मैंने मूल बातें सीख ली हैं लेकिन दुर्भाग्य से मुझे हास्केल में कुछ गंभीर परियोजना करने का मौका नहीं मिला है (मैं हालांकि चाहूंगा, क्योंकि मुझे यह भाषा बहुत पसंद है)।

हालाँकि, जो मैं जानता हूं और किसी ऐसे व्यक्ति के साथ चर्चा से जो कार्यात्मक प्रोग्रामिंग के काफी करीब है, हास्केल सबसे अच्छा समाधान नहीं हो सकता है जब आप ग्राफ एल्गोरिदम को लागू करना चाहते हैं, जहां आपको ग्राफ के माध्यम से चलने और प्रदर्शन करने की आवश्यकता होती है ग्राफ संरचना पर कई स्थानीय परिवर्तन।

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

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

संपादित करें

मैंने हाल ही में कार्यात्मक प्रोग्रामिंग के एक विशेषज्ञ के साथ बात की थी और उन्होंने पुष्टि की कि कुछ ग्राफ एल्गोरिथ्म को कुशलतापूर्वक लागू करना हास्केल में काफी मुश्किल हो सकता है: जैसे कि आप C या C ++ में पॉइंटर्स को घुमाते हुए बहुत तेज हो सकते हैं।


शुद्ध कार्यात्मक दुनिया में ग्राफ हेरफेर / ट्रैवर्सल पर दिलचस्प नोट्स (और लिंक)। उस पर विचार नहीं किया गया था।
डेमियन ब्रेख्त

7
विशुद्ध रूप से कार्यात्मक ग्राफ एल्गोरिदम एक दिलचस्प विषय है। मुहावरेदार समाधान शुद्ध रूप से कार्यात्मक शब्दकोशों के साथ संकेत के स्थान पर अनिवार्य प्रतिनिधित्व का अनुकरण करना है, जैसे किसी कोने में दिए गए शीर्ष पर मैपिंग करना जिसमें इसके किनारे होते हैं। हालाँकि, जब तक एक कमजोर शब्दकोश का उपयोग नहीं किया जाता है, यह स्मृति को रिसाव करेगा क्योंकि अगम्य उपग्रहों को एकत्र नहीं किया जा सकता है और कोई भी विशुद्ध रूप से कार्यात्मक शब्दकोष नहीं है। दिन के अंत में, एक अत्याधुनिक विशुद्ध रूप से कार्यात्मक समाधान दोनों अधिक जटिल और बहुत कम कुशल है!
जॉन हैरोप

1
दूसरी ओर, ग्राफ एल्गोरिदम डिबग करने के लिए कुख्यात हो सकता है और लगातार डेटा संरचना इस समस्या को कम कर सकता है ...
जॉन हैरोप

मैं सोच रहा था कि क्या ग्राफ डेटा प्रकार विकसित करना संभव होगा (बाइटस्ट्रिंग के विचार के बाद: कुशल आंतरिक प्रतिनिधित्व प्लस रूपांतरण / एक्सेस)। मोनाड्स का उपयोग करके ऐसे ग्राफ़ को परस्पर उपयोग करना संभव होना चाहिए। बेशक यह ग्राफ़ के प्रतिनिधित्व के मुद्दे को संबोधित करेगा लेकिन ग्राफ़ एल्गोरिदम को लागू करने का नहीं।
जियोर्जियो

डीएजी एक चीज है। बाकी सब चीज़ों के लिए, आप आलस का फायदा उठा सकते हैं और "गाँठ बाँध सकते हैं"।
डेनियल

4

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

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


3
ट्यूरिंग पूर्णता एक लाल हेरिंग है। अभिकलन का सिद्धांत! = व्यावहारिक प्रोग्रामिंग।

1
@ डेलन यही कारण है कि मैंने सैद्धांतिक रूप से कहा
रयथल

2
वे "समस्या डोमेन" क्या हैं जिनके लिए हास्केल कथित रूप से कम उपयोगी है?
एंड्रेस एफ।

3
हालांकि यह सच है कि समुदाय छोटा है , यह वास्तव में असंगत रूप से सक्रिय है। मुझे लगता है कि freenode पर #haskell चैनल भाषा चैनलों के भीतर लोकप्रियता में #python से पीछे है, और SO पर हास्केल के सवालों का जवाब आश्चर्यजनक रूप से प्रतिस्पर्धी है :)
Tikhon Jelvis

@AndresF। - मैं "कम उपयोगी" कहने के लिए इतनी दूर नहीं जाऊंगा, लेकिन यहां कुछ ऐसे क्षेत्र हैं जहां हास्केल निश्चित रूप से अभी भी अपनी प्रारंभिक अवस्था दिखा रहा है: 1) भारी डीपी - मैंने एक साधारण नैकपैक एल्गोरिथ्म को कोडित किया, और शाब्दिक रूप से हैरान था कि कैसे यह धीमा था। वह बॉक्सिंग सरणियों का उपयोग कर रहा था, इसलिए मुझे कुछ ओवरहेड की उम्मीद थी, लेकिन यह मेरे अनुमान से बहुत अधिक खराब था। 2) बड़े गैर-तुच्छ खेल - एएफआरपी अपनी प्रारंभिक अवस्था में है, इसलिए विशेष रूप से अच्छे ढांचे नहीं हैं, और प्रदर्शन अभी भी भविष्यवाणी करना बहुत मुश्किल है। हम डूम के हास्केल संस्करण को देखने से पहले यह एक लंबा समय होगा। (
खुशबू की

0

तो, यह देखते हुए, मैं जो खोज रहा हूं वह हास्केल के साथ आने वाली समस्याएं या समस्याएं हैं

"हास्केल के साथ समस्याएं" कुछ डोमेन में दिखाई देती हैं। Haskell अनुप्रयोगों के प्रोग्रामिंग के लिए एक अद्भुत भाषा है, और कुछ भी नहीं की तुलना में लिखने के लिए कहीं अधिक सुखद। जब आप कुछ ऐसा करने की कोशिश करते हैं, तो समस्याओं का सामना करना पड़ता है, जैसे कि:

  • क्रॉस संकलन। जीएचसी को क्रॉस कंपाइलर के रूप में बनाया जा सकता है, लेकिन यह प्रक्रिया इसमें शामिल है।
  • एंबेडेड एप्लिकेशन। हास्केल में कचरा बीनने वाले के माध्यम से स्मृति प्रबंधन होता है, इसलिए यह बहुत आश्चर्यजनक नहीं है।
  • स्पीड। हास्केल रस्ट जितना तेज नहीं है, हालांकि ज्यादातर मामलों में यह काफी अच्छी तरह से प्रतिस्पर्धा करेगा। यह अनुप्रयोग डोमेन पर बहुत अधिक निर्भर करता है - शुद्ध संगणना अच्छी तरह से अनुकूलित हो जाती है, लेकिन कुछ ऐसा है "एक बफर में एक फ़ाइल पढ़ें और लाइनों की संख्या की गणना करें" हास्केल में व्यक्त करना कठिन है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.