विशेष रूप से हास्केल में बड़े कार्यात्मक कार्यक्रमों को डिजाइन / संरचना करने का एक अच्छा तरीका क्या है?
मैं ट्यूटोरियल के एक समूह के माध्यम से रहा हूँ (अपने आप को एक स्कीम लिखें जो मेरा पसंदीदा है, रियल वर्ल्ड हास्केल एक करीबी सेकंड के साथ) - लेकिन अधिकांश कार्यक्रम अपेक्षाकृत छोटे हैं, और एकल-उद्देश्य हैं। इसके अतिरिक्त, मैं उनमें से कुछ को विशेष रूप से सुरुचिपूर्ण नहीं मानता (उदाहरण के लिए, WYAS में विशाल लुकअप टेबल)।
मैं अब बड़े कार्यक्रमों को लिखना चाहता हूं, अधिक चलते हुए हिस्सों के साथ - विभिन्न स्रोतों से डेटा प्राप्त करना, इसे साफ करना, इसे विभिन्न तरीकों से संसाधित करना, उपयोगकर्ता इंटरफेस में इसे प्रदर्शित करना, इसे बनाए रखना, नेटवर्क पर संचार करना, आदि। एक ऐसी संरचना जो परिवर्तनशील आवश्यकताओं के लिए सुपाठ्य, रख-रखाव और अनुकूलनीय होने के लिए ऐसी कोड है?
बड़े वस्तु उन्मुख अनिवार्य कार्यक्रमों के लिए इन सवालों को संबोधित करने वाला एक बड़ा साहित्य है। एमओसी, डिजाइन पैटर्न, आदि जैसे विचार एक ओओ शैली में चिंताओं को अलग करने और पुन: प्रयोज्य जैसे व्यापक लक्ष्यों को प्राप्त करने के लिए सभ्य नुस्खे हैं। इसके अतिरिक्त, नई अनिवार्य भाषाएं खुद को 'डिजाइन के रूप में विकसित करती हैं' के लिए उधार देती हैं, जो कि मेरे नौसिखिए की राय में, हास्केल कम अच्छी तरह से अनुकूल प्रतीत होती है।
क्या हास्केल के लिए एक समान साहित्य है? कार्यात्मक प्रोग्रामिंग (मोनैड्स, एरो, एप्लिकेटिव, आदि) में विदेशी नियंत्रण संरचनाओं का चिड़ियाघर इस उद्देश्य के लिए सबसे अच्छा काम कैसे किया जाता है? आप किन सर्वोत्तम प्रथाओं की सिफारिश कर सकते हैं?
धन्यवाद!
EDIT (यह डॉन स्टीवर्ट के जवाब का अनुवर्ती है):
@ डॉन्स ने उल्लेख किया: "मोनाड्स प्रमुख वास्तुशिल्प डिजाइनों को प्रकारों में कैप्चर करते हैं।"
मुझे लगता है कि मेरा सवाल है: शुद्ध कार्यात्मक भाषा में प्रमुख वास्तुशिल्प डिजाइनों के बारे में कैसे सोचना चाहिए?
कई डेटा स्ट्रीम और कई प्रोसेसिंग चरणों के उदाहरण पर विचार करें। मैं डेटा स्ट्रीम के डेटा सेट के लिए मॉड्यूलर पार्सर लिख सकता हूं, और मैं प्रत्येक प्रोसेसिंग चरण को एक शुद्ध फ़ंक्शन के रूप में लागू कर सकता हूं। डेटा के एक टुकड़े के लिए आवश्यक प्रसंस्करण कदम इसके मूल्य और अन्य पर निर्भर करेगा '। GUI अपडेट या डेटाबेस क्वेरी जैसे साइड-इफेक्ट्स के कुछ चरणों का पालन किया जाना चाहिए।
डेटा को बाँधने के लिए 'सही' तरीका और बढ़िया तरीके से पार्सिंग कदम क्या है? एक बड़ा फ़ंक्शन लिख सकता है जो विभिन्न डेटा प्रकारों के लिए सही काम करता है। या जो अभी तक संसाधित किया गया है, उस पर नज़र रखने के लिए एक मोनाड का उपयोग कर सकता है और प्रत्येक प्रसंस्करण कदम को जो कुछ भी चाहिए वह मोनाड राज्य से आगे प्राप्त होगा। या एक बड़े पैमाने पर अलग-अलग कार्यक्रम लिख सकते हैं और संदेश भेज सकते हैं (मुझे यह विकल्प पसंद नहीं है)।
उन्होंने जो स्लाइड्स लिंक की हैं उनमें एक ऐसी चीजें हैं जिनकी हमें आवश्यकता है बुलेट: "टाइप / फ़ंक्शंस / क्लासेस / मोनोड्स पर डिज़ाइन की मैपिंग के लिए मुहावरे"। मुहावरे क्या हैं? :)