हास्केल में बड़े पैमाने पर डिजाइन? [बन्द है]


565

विशेष रूप से हास्केल में बड़े कार्यात्मक कार्यक्रमों को डिजाइन / संरचना करने का एक अच्छा तरीका क्या है?

मैं ट्यूटोरियल के एक समूह के माध्यम से रहा हूँ (अपने आप को एक स्कीम लिखें जो मेरा पसंदीदा है, रियल वर्ल्ड हास्केल एक करीबी सेकंड के साथ) - लेकिन अधिकांश कार्यक्रम अपेक्षाकृत छोटे हैं, और एकल-उद्देश्य हैं। इसके अतिरिक्त, मैं उनमें से कुछ को विशेष रूप से सुरुचिपूर्ण नहीं मानता (उदाहरण के लिए, WYAS में विशाल लुकअप टेबल)।

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

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

क्या हास्केल के लिए एक समान साहित्य है? कार्यात्मक प्रोग्रामिंग (मोनैड्स, एरो, एप्लिकेटिव, आदि) में विदेशी नियंत्रण संरचनाओं का चिड़ियाघर इस उद्देश्य के लिए सबसे अच्छा काम कैसे किया जाता है? आप किन सर्वोत्तम प्रथाओं की सिफारिश कर सकते हैं?

धन्यवाद!

EDIT (यह डॉन स्टीवर्ट के जवाब का अनुवर्ती है):

@ डॉन्स ने उल्लेख किया: "मोनाड्स प्रमुख वास्तुशिल्प डिजाइनों को प्रकारों में कैप्चर करते हैं।"

मुझे लगता है कि मेरा सवाल है: शुद्ध कार्यात्मक भाषा में प्रमुख वास्तुशिल्प डिजाइनों के बारे में कैसे सोचना चाहिए?

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

डेटा को बाँधने के लिए 'सही' तरीका और बढ़िया तरीके से पार्सिंग कदम क्या है? एक बड़ा फ़ंक्शन लिख सकता है जो विभिन्न डेटा प्रकारों के लिए सही काम करता है। या जो अभी तक संसाधित किया गया है, उस पर नज़र रखने के लिए एक मोनाड का उपयोग कर सकता है और प्रत्येक प्रसंस्करण कदम को जो कुछ भी चाहिए वह मोनाड राज्य से आगे प्राप्त होगा। या एक बड़े पैमाने पर अलग-अलग कार्यक्रम लिख सकते हैं और संदेश भेज सकते हैं (मुझे यह विकल्प पसंद नहीं है)।

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


9
मुझे लगता है कि एक कार्यात्मक भाषा में बड़े कार्यक्रम लिखते समय मुख्य विचार छोटा, विशेष और संदेश के माध्यम से संचार करने वाले स्टेटलेस मॉड्यूल होते हैं । बेशक आपको थोड़ा ढोंग करना होगा क्योंकि एक सच्चे कार्यक्रम को राज्य की आवश्यकता होती है। मुझे लगता है कि यह वह जगह है जहां F # हास्केल पर चमकता है।
चोसपंडियन

18
@ कोच लेकिन केवल हास्केल डिफ़ॉल्ट रूप से स्टेटलेसनेस को लागू करता है। आपके पास कोई विकल्प नहीं है, और हास्केल में राज्य (संरचना को तोड़ने के लिए) को शुरू करने के लिए कड़ी मेहनत करनी है :-)
डॉन स्टीवर्ट

7
@ कैशोसियनियन: मैं सिद्धांत से असहमत नहीं हूं। निश्चित रूप से, एक अनिवार्य भाषा में (या संदेश-पास करने के लिए डिज़ाइन किया गया एक कार्यात्मक), जो कि मैं जो कर सकता हूं वह बहुत अच्छी तरह से हो सकता है। लेकिन हास्केल के पास राज्य से निपटने के अन्य तरीके हैं, और शायद उन्होंने मुझे 'शुद्ध' लाभों से अधिक रखने दिया।
दान

1
मैंने इस दस्तावेज़ में "डिज़ाइन दिशानिर्देश" के तहत इसके बारे में थोड़ा लिखा है: community.haskell.org/~ndm/downloads/…
नील मिशेल

5
@JonHarrop यह मत भूलिए कि जब आप समान भाषाओं में परियोजनाओं की तुलना करते हैं, तो MLOC एक अच्छी मीट्रिक है, यह क्रॉस-लैंग्वेज की तुलना के लिए बहुत मायने नहीं रखता है, विशेष रूप से हास्केल जैसी भाषाओं के साथ, जहां कोड का पुन: उपयोग और प्रतिरूपकता बहुत अधिक आसान और सुरक्षित है वहां की कुछ भाषाओं की तुलना में।
Tair

जवाबों:


519

मैं हास्केल में इंजीनियरिंग लार्ज प्रोजेक्ट्स और एक्समोनड के डिजाइन और कार्यान्वयन में इसके बारे में थोड़ी बात करता हूं। बड़े में इंजीनियरिंग जटिलता के प्रबंधन के बारे में है। जटिलता के प्रबंधन के लिए हास्केल में प्राथमिक कोड संरचना तंत्र हैं:

प्रकार प्रणाली

  • अमूर्त को लागू करने के लिए टाइप सिस्टम का उपयोग करें, बातचीत को सरल बनाना।
  • प्रमुख आक्रमणकारियों को प्रकारों के माध्यम से लागू करें
    • (उदाहरण के लिए कि कुछ मान कुछ दायरे से बच नहीं सकते)
    • वह निश्चित कोड कोई IO नहीं करता है, डिस्क को स्पर्श नहीं करता है
  • सुरक्षा को लागू करें: जाँच अपवाद (शायद / या तो), मिक्स कॉन्सेप्ट से बचें (वर्ड, इंट, एड्रेस)
  • अच्छे डेटा स्ट्रक्चर्स (जैसे ज़िपर्स) परीक्षण के कुछ वर्गों को अनावश्यक बना सकते हैं, क्योंकि वे नियमबद्ध करते हैं जैसे कि आउट ऑफ बाउंड्स त्रुटियां।

प्रोफाइलर

  • अपने कार्यक्रम के ढेर और समय प्रोफाइल के वस्तुनिष्ठ प्रमाण प्रदान करें।
  • हीप प्रोफाइलिंग, विशेष रूप से, बिना किसी अनावश्यक मेमोरी उपयोग को सुनिश्चित करने का सबसे अच्छा तरीका है।

पवित्रता

  • राज्य को हटाकर नाटकीय रूप से जटिलता को कम करें। विशुद्ध रूप से कार्यात्मक कोड तराजू, क्योंकि यह संरचना है। आपको केवल कुछ कोड का उपयोग करने का तरीका निर्धारित करने की आवश्यकता है - जब आप प्रोग्राम के कुछ अन्य हिस्से को बदलते हैं तो यह रहस्यमय तरीके से नहीं टूटेगा।
  • "मॉडल / दृश्य / नियंत्रक" शैली प्रोग्रामिंग के बहुत से उपयोग करें: विशुद्ध रूप से कार्यात्मक डेटा संरचनाओं में जितनी जल्दी हो सके बाहरी डेटा को पार्स करें, उन संरचनाओं पर काम करें, फिर एक बार सभी काम पूरा हो जाने के बाद, प्रस्तुत करना / बाहर निकालना / क्रमबद्ध करना। आपके अधिकांश कोड को शुद्ध रखता है

परिक्षण

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

संरचना के लिए मोनाड

  • मोनाड्स प्रमुख वास्तुशिल्प डिजाइनों को प्रकारों में कैप्चर करते हैं (यह कोड हार्डवेयर तक पहुंचता है, यह कोड एक एकल-उपयोगकर्ता सत्र है, आदि)
  • उदाहरण के लिए, एक्सनैड में एक्स मोनड, सिस्टम के किन घटकों के लिए दिखाई देता है, इसके लिए डिजाइन को सटीक रूप से कैप्चर करता है।

प्रकार और अस्तित्व के प्रकार

  • अमूर्तता प्रदान करने के लिए प्रकार की कक्षाओं का उपयोग करें: बहुपद इंटरफेस के पीछे कार्यान्वयन को छिपाएं।

सामंजस्य और समानता

  • parआसान, संयोजनीय समानता के साथ प्रतियोगिता को हरा देने के लिए अपने कार्यक्रम में चुपके ।

Refactor

  • आप हास्केल में बहुत रिफ्लेक्टर कर सकते हैं । यदि आप बुद्धिमानी से प्रकारों का उपयोग कर रहे हैं, तो आपके बड़े पैमाने पर परिवर्तन सुरक्षित रहेंगे। यह आपके कोडबेस स्केल में मदद करेगा। सुनिश्चित करें कि आपके रिफैक्टरिंग पूर्ण होने तक टाइप त्रुटियों का कारण बनेंगे।

एफएफआई का बुद्धिमानी से उपयोग करें

  • एफएफआई विदेशी कोड के साथ खेलना आसान बनाता है, लेकिन यह विदेशी कोड खतरनाक हो सकता है।
  • लौटे डेटा के आकार के बारे में मान्यताओं में बहुत सावधान रहें।

मेटा प्रोग्रामिंग

  • टेम्प्लेट हास्केल या जेनरिक का थोड़ा सा बॉयलरप्लेट निकाल सकता है।

पैकेजिंग और वितरण

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

चेतावनी

  • -Wallअपने कोड को गंध से साफ रखने के लिए उपयोग करें । आप अधिक आश्वासन के लिए एजडा, इसाबेल या कैच को भी देख सकते हैं। लिंट की तरह जाँच के लिए, महान hlint देखें , जो सुधार का सुझाव देगा।

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

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


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

6
मैंने मॉड्यूल में डिज़ाइन के अपघटन पर कुछ पाठ जोड़ा है। आपका लक्ष्य तार्किक रूप से संबंधित कार्यों को पहचानने के लिए मॉड्यूल में है जो सिस्टम के अन्य भागों के साथ संदर्भित पारदर्शी इंटरफेस है, और जितनी जल्दी हो सके विशुद्ध रूप से कार्यात्मक डेटा प्रकारों का उपयोग करना है, बाहरी दुनिया को सुरक्षित रूप से मॉडल करना है। : Xmonad डिजाइन दस्तावेज़ इस का एक बहुत शामिल किया गया xmonad.wordpress.com/2009/09/09/...
डॉन स्टीवर्ट

3
मैंने हास्केल टॉक में इंजीनियरिंग लार्ज प्रोजेक्ट्स से स्लाइड डाउनलोड करने की कोशिश की , लेकिन लिंक टूट गया। : यहाँ एक काम एक है galois.com/~dons/talks/dons-londonhug-decade.pdf
mik01aj

3
मैं यह नया डाउनलोड लिंक ढूंढने में
रिकार्डो टी।

3
@ हीथर भले ही पृष्ठ पर डाउनलोड लिंक पर टिप्पणी में उल्लेख किया हो, ठीक से पहले काम नहीं करता है, ऐसा लगता है कि स्लाइड्स को अभी भी स्क्रिब्ड पर देखा जा सकता है: scribd.com/doc/19503176/The-Design-and-Isk
Riccardo T.

118

डॉन ने आपको ऊपर दिए गए अधिकांश विवरण दिए हैं, लेकिन यहां हास्केल में सिस्टम डेमॉन जैसे वास्तव में किटी-किरकिरा राज्य कार्यक्रमों को करने से मेरे दो सेंट हैं।

  1. अंत में, आप एक मोनड ट्रांसफार्मर स्टैक में रहते हैं। सबसे नीचे IO है। उसके ऊपर, प्रत्येक प्रमुख मॉड्यूल (अमूर्त अर्थ में, न कि मॉड्यूल-इन-फ़ाइल समझ) अपनी आवश्यक स्थिति को उस स्टैक में एक परत में मैप करता है। इसलिए यदि आपके पास अपना डेटाबेस कनेक्शन कोड एक मॉड्यूल में छिपा हुआ है, तो आप यह सब लिखते हैं कि एक प्रकार से अधिक MonadReader कनेक्शन m => ... -> m ... और फिर आपके डेटाबेस फ़ंक्शन हमेशा अन्य से कार्यों के बिना अपना कनेक्शन प्राप्त कर सकते हैं। मॉड्यूल को अपने अस्तित्व के बारे में पता होना चाहिए। आप अपने डेटाबेस कनेक्शन को ले जाने वाली एक परत के साथ समाप्त हो सकते हैं, आपका दूसरा कॉन्फ़िगरेशन, एक तीसरा आपके विभिन्न अर्धवृत्त और mvars समानांतरता और तुल्यकालन के समाधान के लिए, एक और आपके लॉग फ़ाइल हैंडल आदि।

  2. पहले अपनी त्रुटि से निपटने का चित्र लें । बड़े सिस्टम में हास्केल के लिए इस समय सबसे बड़ी कमजोरी हो सकता है कि (जो गलत है, क्योंकि आप क्या गलत हुआ पर कोई जानकारी नहीं लौट सकते जैसे घटिया सहित त्रुटि से निपटने के तरीकों, की अधिकता है, हमेशा या तो बजाय हो सकता है कि जब तक आप वास्तव में उपयोग करें बस लापता मूल्यों का मतलब है)। पता लगाएँ कि आप इसे पहले कैसे करने जा रहे हैं, और अपने पुस्तकालयों और अन्य कोड का उपयोग करने वाले विभिन्न त्रुटि तंत्र से एडेप्टर को अपने अंतिम एक में सेट करें। यह आपको बाद में दु: ख की दुनिया से बचाएगा।

परिशिष्ट (टिप्पणियों से निकाला; करने के लिए धन्यवाद Lii और liminalisht ) -
एक ढेर में monads में एक बड़े कार्यक्रम काट करने के लिए अलग अलग तरीके के बारे में अधिक चर्चा:

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


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

6
@Lii बेन कोलेरा इस विषय पर एक महान व्यावहारिक परिचय देता है, और ब्रायन हर्टlift आपके कस्टम मोनड में आईएनजी मोनोडिक क्रियाओं की समस्या के समाधान पर चर्चा करते हैं । जॉर्ज विल्सन शो कैसे उपयोग करने के लिए mtlकोड है कि किसी भी इकाई के साथ काम करता है कि लागू की आवश्यकता typeclasses, बजाय अपने कस्टम प्रकार इकाई लिखने के लिए। कार्लो हमालेनेन जॉर्ज बात का सारांश कुछ कम, उपयोगी नोट लिखा है।
लिमिनेलिश

मैं इस बात से सहमत हूं कि मोनाड ट्रांसफॉर्मर स्टैक प्रमुख वास्तु नींव हैं, लेकिन मैं उनमें से आईओ को बाहर रखने की बहुत कोशिश करता हूं। यह हमेशा संभव नहीं है, लेकिन अगर आप सोचते हैं कि आपके मठ में "और फिर" का क्या मतलब है, तो आपको पता चल सकता है कि आपके पास वास्तव में नीचे एक निरंतरता या ऑटोमेटन है, जिसे "रन" फ़ंक्शन द्वारा IO में व्याख्या किया जा सकता है।
पॉल जॉनसन

जैसा कि @PaulJohnson पहले ही बता चुका है, यह मोनाड ट्रांसफॉर्मर स्टैक दृष्टिकोण माइकल स्नॉयमैन के रीडरटी डिज़ाइन पैटर्न
McBear Holden

43

हास्केल में बड़े कार्यक्रमों को डिजाइन करना अन्य भाषाओं में ऐसा करने से अलग नहीं है। बड़े में प्रोग्रामिंग आपकी समस्या को प्रबंधनीय टुकड़ों में तोड़ने के बारे में है, और उन लोगों को एक साथ कैसे फिट किया जाए; कार्यान्वयन भाषा कम महत्वपूर्ण नहीं है।

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

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


14
मुझे वास्तव में पता चला कि यदि डेटा प्रकारों को बदलने की आवश्यकता है, तो रिफैक्टरिंग काफी निराशाजनक है। यह उबाते निर्माणकर्ता और पैटर्न मैचों की बहुत सारी की arity को संशोधित करने की आवश्यकता है। (मैं मानता हूं कि शुद्ध कार्यों को उसी प्रकार के अन्य शुद्ध कार्यों में शामिल करना आसान है - जब तक कोई डेटा प्रकारों को नहीं छूता है)
Dan

2
जब आप रिकॉर्ड्स का उपयोग करते हैं तो आप छोटे बदलावों के साथ पूरी तरह से मुक्त हो सकते हैं। कुछ लोग रिकॉर्ड को एक आदत बनाना चाहते हैं (मैं उनमें से एक ^ ^ "हूं)।
MasterMastic

5
@ क्या मेरा मतलब है कि यदि आप किसी भी भाषा में फ़ंक्शन के डेटा प्रकार को बदलते हैं तो क्या आपको भी ऐसा नहीं करना है? मैं नहीं देखता कि जावा या C ++ जैसी भाषा इस संबंध में आपकी कैसे मदद करेगी। यदि आप कहते हैं कि आप कुछ प्रकार के सामान्य इंटरफ़ेस का उपयोग कर सकते हैं, जो दोनों प्रकारों का पालन करते हैं, तो आपको हास्केल में टाइपकालेज़ के साथ ऐसा करना चाहिए।
अर्धविराम

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

16

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

द क्राफ्ट ऑफ फंक्शनल प्रोग्रामिंग

द क्राफ्ट ऑफ फंक्शनल प्रोग्रामिंग

http://www.cs.kent.ac.uk/people/staff/sjt/craft2e/


11
जैसा कि एफपी के शिल्प के रूप में महान है - मैंने इससे हास्केल सीखा - यह शुरुआती प्रोग्रामर के लिए एक परिचयात्मक पाठ है , हास्केल में बड़ी प्रणालियों के डिजाइन के लिए नहीं।
डॉन स्टीवर्ट

3
खैर, यह सबसे अच्छी किताब है जो मुझे एपीआई के डिजाइन और कार्यान्वयन के विवरण को छिपाने के बारे में पता है। इस पुस्तक के साथ, मैं C ++ में एक बेहतर प्रोग्रामर बन गया - सिर्फ इसलिए कि मैंने अपने कोड को व्यवस्थित करने के बेहतर तरीके सीखे। ठीक है, आपका अनुभव (और उत्तर) निश्चित रूप से इस पुस्तक से बेहतर है, लेकिन डैन शायद हास्केल में अभी भी शुरुआत कर सकते हैं । ( where beginner=do write $ tutorials `about` Monads)
comonad

11

मैं वर्तमान में "कार्यात्मक डिजाइन और वास्तुकला" शीर्षक के साथ एक पुस्तक लिख रहा हूं। यह आपको तकनीकों का एक पूरा सेट प्रदान करता है कि शुद्ध कार्यात्मक दृष्टिकोण का उपयोग करके एक बड़ा एप्लिकेशन कैसे बनाया जाए। यह स्कैड से स्पेसशिप को नियंत्रित करने के लिए SCADA जैसे एप्लिकेशन 'एंड्रोमेडा' का निर्माण करते समय कई कार्यात्मक पैटर्न और विचारों का वर्णन करता है। मेरी प्राथमिक भाषा हास्केल है। पुस्तक में शामिल है:

  • आरेखों का उपयोग करते हुए वास्तुकला मॉडलिंग के दृष्टिकोण;
  • आवश्यकताओं के विश्लेषण;
  • एंबेडेड डीएसएल डोमेन मॉडलिंग;
  • बाहरी डीएसएल डिजाइन और कार्यान्वयन;
  • प्रभाव वाले उप-तंत्र के रूप में मोनाड;
  • कार्यात्मक इंटरफेस के रूप में मुफ्त मोनाड्स;
  • बढ़े हुए ईडीएसएल;
  • नि: शुल्क monadic eDSLs का उपयोग करके नियंत्रण का उलटा;
  • सॉफ्टवेयर ट्रांसेक्शनल मेमोरी;
  • लेंस;
  • राज्य, रीडर, लेखक, RWS, अनुसूचित जनजाति monads;
  • आवेग की स्थिति: IORef, MVar, STM;
  • मल्टीथ्रेडिंग और समवर्ती डोमेन मॉडलिंग;
  • जीयूआई;
  • यूएमएल, एसओएलआईडी, जीआरएएसपी जैसी मुख्यधारा की तकनीकों और दृष्टिकोणों की प्रयोज्यता;
  • अशुद्ध उपप्रणालियों के साथ सहभागिता।

आप यहाँ पुस्तक के लिए कोड , और 'एंड्रोमेडा' प्रोजेक्ट कोड से परिचित हो सकते हैं ।

मैं 2017 के अंत में इस किताब खत्म करने तक ऐसा होता है, आप मेरे लेख "डिजाइन और वास्तुकला कार्यात्मक प्रोग्रामिंग में" (रस) पढ़ सकते हैं उम्मीद यहाँ

अपडेट करें

मैंने अपनी पुस्तक ऑनलाइन (पहले 5 अध्याय) साझा की। Reddit पर पोस्ट देखें


अलेक्जेंडर, क्या आप कृपया इस नोट को अपडेट कर सकते हैं जब आप पुस्तक पूरी कर लेंगे, तो हम इसका अनुसरण कर सकते हैं। चीयर्स।
मैक्स

4
ज़रूर! अभी के लिए मैंने पाठ का आधा भाग समाप्त कर दिया है, लेकिन यह समग्र कार्य का 1/3 है। इसलिए, अपनी रुचि बनाए रखें, इससे मुझे बहुत प्रेरणा मिलती है!
ग्रेनिनस

2
नमस्ते! मैंने अपनी पुस्तक ऑनलाइन (केवल पहले 5 अध्याय) साझा की। Reddit पर पोस्ट देखें: reddit.com/r/haskell/comments/6ck72h/…
graninas

साझा करने और काम करने के लिए धन्यवाद!
अधिकतम

वास्तव में इसकी प्रतीक्षा है!
देशभक्त

7

गेब्रियल का ब्लॉग पोस्ट स्केलेबल प्रोग्राम आर्किटेक्चर एक उल्लेख के लायक हो सकता है।

हास्केल डिजाइन पैटर्न एक महत्वपूर्ण तरीके से मुख्यधारा के डिजाइन पैटर्न से भिन्न होते हैं:

  • परम्परागत वास्तुकला : प्रकार A के साथ "B" और "टोपोलॉजी" टाइप B उत्पन्न करने के लिए कई घटकों को मिलाएं

  • हास्केल वास्तुकला : एक ही प्रकार ए के एक नए घटक को उत्पन्न करने के लिए टाइप ए के साथ कई घटकों को मिलाएं, इसके प्रतिस्थापन भागों से चरित्र में अविभाज्य

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

जैसा कि टिप्पणियों में लिमिनेलिश का उल्लेख है, श्रेणी डिज़ाइन पैटर्न गैब्रियल द्वारा इसी तरह की नस में विषय पर एक और पोस्ट है।


3
मैं श्रेणी डिजाइन पैटर्न पर गेब्रियल गोंजालेज द्वारा एक और पोस्ट का उल्लेख करूंगा । उनका मूल तर्क यह है कि हम जो कार्यात्मक प्रोग्रामर "अच्छा आर्किटेक्चर" के बारे में सोचते हैं वह वास्तव में "कंपोजिटल आर्किटेक्चर" है - यह उन वस्तुओं का उपयोग करके प्रोग्राम डिजाइन कर रहा है जिनकी रचना करने की गारंटी है। चूंकि श्रेणी कानूनों की गारंटी है कि पहचान और संबद्धता रचना के तहत संरक्षित कर रहे हैं, एक compositional वास्तुकला कपोल-कल्पना का उपयोग कर के माध्यम से हासिल की है जिसके लिए हम एक वर्ग है - जैसे शुद्ध काम करता है, monadic कार्यों, पाइप, आदि
liminalisht


3

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

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

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