हास्केल उत्पादन कोड में कितनी बार seq का उपयोग किया जाता है?


23

हास्केल में मुझे छोटे उपकरण लिखने का कुछ अनुभव है और मुझे यह उपयोग करने में बहुत सहज लगता है, विशेष रूप से फ़िल्टर (उपयोग interact) लिखने के लिए जो उनके मानक इनपुट को संसाधित करते हैं और इसे मानक आउटपुट में पाइप करते हैं।

हाल ही में मैंने एक फ़ाइल पर एक ऐसे फ़िल्टर का उपयोग करने की कोशिश की जो सामान्य से लगभग 10 गुना बड़ा था और मुझे एक Stack space overflowत्रुटि मिली ।

कुछ पढ़ने के बाद (जैसे यहाँ और यहाँ ) मैंने स्टैक स्पेस (अनुभवी हास्केलर्स को बचाने के लिए दो दिशानिर्देशों की पहचान की है, कृपया मुझे सही करें अगर मैं कुछ लिखूं जो सही नहीं है):

  1. पुनरावर्ती फ़ंक्शन कॉल से बचें जो पूंछ-पुनरावर्ती नहीं हैं (यह सभी कार्यात्मक भाषाओं के लिए मान्य है जो पूंछ-कॉल अनुकूलन का समर्थन करते हैं)।
  2. seqउप-अभिव्यक्तियों के प्रारंभिक मूल्यांकन को मजबूर करने के लिए परिचय दें ताकि वे कम होने से पहले अभिव्यक्ति बहुत बड़े न हों (यह हास्केल के लिए विशिष्ट है, या कम से कम भाषाओं में आलसी मूल्यांकन का उपयोग करके)।

seqमेरे कोड में पांच या छह कॉल शुरू करने के बाद मेरा टूल फिर से आसानी से चलता है (बड़े डेटा पर भी)। हालाँकि, मुझे लगता है कि मूल कोड थोड़ा अधिक पठनीय था।

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


1
आपके द्वारा वर्णित तरह तरह के अनुकूलन लगभग हमेशा कोड को थोड़ा कम सुरुचिपूर्ण बनाने के लिए जा रहे हैं।
रॉबर्ट हार्वे

@ रॉबर्ट हार्वे: क्या स्टैक का उपयोग कम रखने के लिए कोई वैकल्पिक तकनीक है? मेरा मतलब है कि मुझे लगता है कि मुझे अपने कार्यों को अलग तरह से फिर से लिखना होगा लेकिन मुझे कोई सुराग नहीं है कि क्या अच्छी तरह से स्थापित तकनीकें हैं। मेरा पहला प्रयास पूंछ-पुनरावर्ती कार्यों का उपयोग करना था, जिसने मदद की लेकिन मुझे अपनी समस्या को पूरी तरह से हल करने की अनुमति नहीं दी।
जियोर्जियो

जवाबों:


17

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

हालांकि, ऐसी संभावनाएं हैं कि seqसीधे उपयोग करने से कैसे बचें । यह कोड क्लीनर और अधिक मजबूत बना सकता है। कुछ विचार:

  1. के बजाय नाली , पाइप या पुनरावृत्त का उपयोग करें interact। आलसी IO को प्रबंधन संसाधनों (न केवल स्मृति) के साथ समस्याएं हैं और इसे दूर करने के लिए इट्रेट्स बिल्कुल डिज़ाइन किए गए हैं। (मैं आलसी IO से बचने के लिए सुझाव देना चाहूंगा, चाहे आपका डेटा कितना भी बड़ा क्यों न हो - आलसी I / O के साथ समस्या देखें ।)
  2. इसके बजाय seqसीधे उपयोग (या अपने खुद के डिजाइन) जैसे कि 'फोल्ड' या फोल्ड ' या पुस्तकालयों के सख्त संस्करणों (जैसे Data.Map.Strict या Control.Monad.State.St प्रतिबंध ) का उपयोग करने के लिए जो कड़े संकलन के लिए डिज़ाइन किए गए हैं।
  3. BangPatterns एक्सटेंशन का उपयोग करें । यह seqसख्त पैटर्न मिलान के साथ बदलने की अनुमति देता है । सख्त निर्माण क्षेत्र की घोषणा करना कुछ मामलों में भी उपयोगी हो सकता है।
  4. मूल्यांकन के लिए रणनीतियाँ का उपयोग करना भी संभव है । रणनीतियाँ पुस्तकालय ज्यादातर समानांतर संगणना के उद्देश्य से है, लेकिन WHNF ( rseq) या पूर्ण NF ( rdeepseq) के लिए एक मूल्य के लिए मजबूर करने के तरीके भी हैं। संग्रह के साथ काम करने, रणनीतियों के संयोजन आदि के लिए कई उपयोगिता विधियां हैं।

+1: उपयोगी संकेत और लिंक के लिए धन्यवाद। बिंदु 3 काफी दिलचस्प लगता है (और मेरे लिए अभी उपयोग करने का सबसे आसान समाधान)। सुझाव 1 के बारे में, मैं यह नहीं देखता कि आलसी IO से बचने से चीजों को कैसे बेहतर बनाया जा सकता है: जहां तक ​​मैं समझता हूं कि आलसी IO को एक फिल्टर के लिए बेहतर होना चाहिए जो डेटा की (संभवतः बहुत लंबी) धारा को संसाधित करने वाला हो।
जियोर्जियो

2
@ जियोर्जियो I ने आलसी विकी के साथ समस्याओं के बारे में हास्केल विकी का लिंक जोड़ा। आलसी IO के साथ आपके पास संसाधनों को प्रबंधित करने में बहुत कठिन समय हो सकता है। उदाहरण के लिए, यदि आप इनपुट को पूरी तरह से नहीं पढ़ते हैं (जैसे आलसी मूल्यांकन के कारण), तो फ़ाइल हैंडल खुला रहता है । और यदि आप फ़ाइल हैंडल को मैन्युअल रूप से जाते हैं और बंद करते हैं, तो अक्सर ऐसा होता है कि आलसी मूल्यांकन पढ़ने के कारण इसे स्थगित कर दिया जाता है और आप पूरे इनपुट को पढ़ने से पहले हैंडल को बंद कर देते हैं। और, यह अक्सर आलसी IO के साथ स्मृति समस्याओं से बचने के लिए काफी कठिन है।
पेट्र पुल्लक

मुझे हाल ही में यह समस्या हुई थी और मेरा प्रोग्राम फ़ाइल विवरणकों से बाहर चल रहा था। इसलिए मैंने आलसी IO को सख्त IO के साथ सख्त उपयोग करके बदल दिया ByteString
जियोर्जियो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.