मुझे संदेह है कि यह भाषा पर निर्भर करता है। जहां तक कार्यात्मक प्रोग्रामिंग की बात है, मैंने ज्यादातर हास्केल में डब किया है, इसलिए मैं यह समझाने जा रहा हूं कि यह वहां कैसे काम करता है।
हास्केल कोड को "मॉड्यूल" में व्यवस्थित किया गया है जो मूल रूप से केवल फ़ंक्शन और डेटा प्रकारों का संग्रह है। प्रत्येक मॉड्यूल एक एकल फ़ाइल है। एक मॉड्यूल जावा वर्ग और एक जावा पैकेज के बीच मिश्रण का कुछ है - एक मॉड्यूल क्या करता है इसका सटीक दायरा। एक मॉड्यूल का भी नियंत्रण होता है कि कौन से फ़ंक्शंस और प्रकार के निर्माणकर्ता निर्यात करने के लिए, और कौन से छिपाने के लिए; इस के समान है private
और public
जावा में।
अपने स्वयं के कार्यक्रमों में, मुझे मॉड्यूल एक काम करना पसंद है, शब्दार्थ; यह उन्हें एक जावा वर्ग की तरह बनाता है सिवाय इसके कि वे कई डेटा प्रकारों को परिभाषित कर सकते हैं। मानक पुस्तकालय से मैं जिन मॉड्यूल का उपयोग करता हूं, जैसे Data.List
, वे पैकेज की तरह अधिक होते हैं - वे समान उपयोगिता कार्यों का एक सेट प्रदान करते हैं। यह भी स्थिर जावा कक्षाओं की तरह ही है java.util.Arrays
।
मॉड्यूल जावा पैकेज की तरह भी होते हैं, ताकि उन्हें स्पष्टता के लिए नस्ट किया जा सके (मुझे नहीं लगता कि इसका कोड पर कोई प्रभाव पड़ता है)। सामान्य तौर पर, एक ही परियोजना के लिए, मैं इसे एक नाम (कहता हूं Project
) देता हूं और मेरे सभी मॉड्यूल इस (जैसे Project.Parse
और Project.Run
) का हिस्सा हैं । यदि मैं कोड लिख रहा था जो कि एक आवेदन की तुलना में पुस्तकालय की तरह अधिक था, तो मैं इसे इस आधार पर व्यवस्थित करूंगा कि यह क्या कर रहा है, जैसे Data.List
या Control.Monad
। अन्य भाषाओं से एक बड़ा अंतर यह है कि हास्केल आईओ को सीमित करने और सभी को एक ही स्थान पर रखने के लिए प्रोत्साहित करता है। बड़ी संख्या में मॉड्यूल बिल्कुल भी IO नहीं करते हैं, और किसी भी परियोजना के लिए, मुझे यथासंभव अधिक शुद्ध होने के लिए पसंद है।
एक उदाहरण के रूप में, मैं एक साधारण प्रोग्रामिंग भाषा पर काम कर रहा हूं जिसे मैं टीपीएल कह रहा हूं (बिना किसी अच्छे कारण के)। इसके लिए मैंने दो सरल मॉड्यूल बनाए हैं: TPL.Parse
जो भाषा के आंतरिक प्रतिनिधित्व को परिभाषित करता है और इसे कैसे पार्स किया जाता है, और TPL.Run
जो दुभाषिया को चलाता है और चर और IO से संबंधित है। वास्तव में कोड को संकलित करने और चलाने के लिए, आमतौर पर एक Main
मॉड्यूल होता है जो कार्यक्रम के प्रवेश बिंदु होने पर समाप्त होता है।
फ़ाइल के भीतर फ़ंक्शन को व्यवस्थित करने में महत्वपूर्ण स्वतंत्रता है; यह वही है जो मुझे करना पसंद है। मैं अपने डेटा प्रकारों को शीर्ष की ओर परिभाषित करता हूं, इससे पहले कि वे कहीं और उपयोग किए जाएं। डेटा प्रकारों को परिभाषित करने के ठीक बाद, मैं उन्हें अपने उपयुक्त टाइपकास्ट का हिस्सा बनाने के लिए जो कुछ भी आवश्यक है उसे लागू करता हूं - यह एक इंटरफ़ेस को लागू करने की तरह है। फिर मैं तर्क और विभिन्न सहायक कार्यों के साथ उपयुक्त के रूप में पालन करता हूं। अंत में, मुझे अपने सभी IO फ़ंक्शंस बहुत ही निचले स्तर पर समाप्त करना पसंद है main
। इससे यह स्पष्ट होता है कि कोई भी IO क्या कर रहा है और कहां से कार्यक्रम शुरू होता है।
तो, संक्षेप में: फ़ंक्शन मॉड्यूल में निहित हैं, जिनमें से प्रत्येक एक फ़ाइल से बना है। कई मॉड्यूल एक प्रोग्राम या लाइब्रेरी बना सकते हैं; पूर्व में आम तौर पर एक Main
मॉड्यूल शामिल होता है जो इसका प्रवेश बिंदु होता है। एक फ़ाइल के भीतर, संगठन के लिए अलग-अलग विकल्प हैं, लेकिन मैं शीर्ष के पास डेटा प्रकार, नीचे के पास आईओ और बीच में तर्क देना पसंद करता हूं।
What's stopping you from...
वर्षों और एक पूरी तरह से अलग मानसिकता के साथ प्रोग्रामिंग के वर्ष, इस बिंदु पर कि हास्केल कोड मानसिक रूप से गणना नहीं करता है। और निश्चित रूप से आप मान रहे हैं कि वास्तविक परियोजनाएं हमेशा सही ढंग से और बड़े करीने से व्यवस्थित होती हैं (हो सकता है कि वे हैं, लेकिन मुझे पता है कि मेरे लिए एक noob कैसे है?)