2009-08-01 3 views
13

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

+1

और दूसरा होना चाहिए-समुदाय-विकी ... – chaos

+0

प्रश्न की यह शैली आमतौर पर एक समुदाय विकी के रूप में बेहतर सराहना की जाती है। – zombat

+0

यह कल्पना करना मुश्किल है कि यह "वास्तविक प्रश्न नहीं" क्यों है जब एसओ पर इतने सारे "सामान्य प्रोग्रामिंग गलतियों" प्रश्न हैं जो बच गए हैं। –

उत्तर

15

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

एक और आम गलती भूल जाती है कि let हमेशा रिकर्सिव है। को अनैच्छिक

let x = ... x ... 

परिणामों चौंकाने वाला हो सकता है।

अधिकांश अन्य सामान्य बुरे अनुभव गलतियों के रूप में प्रकट नहीं होते हैं, लेकिन प्रकार के चेकर्स के पीछे प्रोग्राम प्राप्त करने में परेशानी होती है, या मोनैडिक I/O मॉडल को समझने में कठिनाई होती है। सूची समझ के साथ कठिनाइयों और do नोटेशन कभी-कभी होते हैं।

सामान्य में कठिनाइयों हास्केल प्रोग्रामर शुरुआत के सामने आने वाली

  • कई अंधेरे कोनों के साथ बड़े भाषा, विशेष रूप से प्रकार प्रणाली
  • परेशानी हो रही कार्यक्रमों को संकलित करने में, जब वे मुझे क्या करना विशेष रूप से/ओ
  • शामिल
  • महान आलसी कार्यात्मक कार्यक्रमों
01 का समय और स्थान व्यवहार की भविष्यवाणी कठिनाई IO इकाई में सब कुछ कर रहा
8

के लिए एक आम गलती हास्केल प्रोग्रामर forget the difference between constructor and type namespaces है। यह इतनी शुरुआती गलती थी कि मैं इसके नाम से जुड़ा हुआ शर्मिंदा हूं, लेकिन मुझे पूरा भरोसा है कि दूसरों को एक ही समस्या होने पर उस जवाब पर ठोकर खाई जाएगी, इसलिए इसे वहां भी रख सकते हैं।

4

[] और [[]] के बीच का अंतर: खाली सूची और 1 तत्व के साथ सूची, अर्थात् खाली सूची। यह विशेष रूप से रिकर्सिव कार्यों के मूल मामलों में पॉप अप करता है।

-1

गैर पूंछ-रिकर्सिव फ़ंक्शंस का उपयोग करें या स्टैक ओवरफ़्लो के लिए होने वाली सख्त फ़ोल्डर्स का उपयोग न करें।

+2

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

+1

मुझे पता है, लेकिन सिर (x: xs) = head xs + 1 1000000 वस्तुओं की सूची में विस्फोट नहीं करेगा? – Hai

+0

मैंने सफलता के बिना 'हेड' (x: xs) = x '= head' 'xs x' \ 'seq \' x '+ 1' में कोशिश की थी। किसी के पास कोई सुराग है? – ScootyPuff

-1

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

wrongFunc n = if n > 18 
       then 1 
       else False 

यदि ब्लॉक एक पूर्णांक के लिए evalutes जहां अन्य एक बूल देता है। यह एक सामान्य त्रुटि है जैसे हास्केल में वे केवल बयानों के ब्लॉक नहीं हैं बल्कि अभिव्यक्तियां हैं।

+3

मुझे नहीं लगता कि यह भ्रमित क्यों है, और मैं एक हास्केल नौसिखिया हूं। सी-जैसी भाषा में एक ही चीज़ की तुलना करें: आपके पास स्पष्ट रिटर्न होगा, लेकिन वापसी प्रकार को या तो int या bool होना चाहिए और तर्क के मान के आधार पर 1 या झूठी वापसी करने में त्रुटि होगी। – Zak

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