haskell सहायक कार्यों के लिए आपका नामकरण सम्मेलन क्या है?




functional-programming naming-conventions (6)

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

reverse :: [a] -> [a]
reverse = reverse_helper []

reverse_helper :: [a] -> [a] -> [a]
reverse_helper result [] = result
reverse_helper result (x:xs) = reverse_helper (x:result) xs

"रिवर्स_हेल्पर" वास्तव में एक अच्छा, वर्णनात्मक नाम नहीं है। हालांकि, "reverse_recursive_part" सिर्फ अजीब है

इस तरह के सहायक कार्यों के लिए नामकरण का नाम क्या होगा?


सेटअप और निष्पादित

उदाहरण:

function whateverSetup() { ... }
function whateverExecute() { ... }

मैं श्रीवत्स के साथ सहमत हूं, यदि आप शीर्ष स्तर (या बदतर, निर्यात सूची में डाल) सहायक फ़ंक्शन नहीं बनाते हैं, तो इससे कोई फर्क नहीं पड़ता कि उसका नाम क्या है। मैं हेल्पर फ़ंक्शन f और g को कॉल करता हूं।

reverse :: [a] -> [a]
reverse = f []
  where
    f ys []     = xs
    f ys (x:xs) = f (x:ys) xs

मैं सिर्फ छोटी फ़ंक्शंस के लिए इस नामकरण योजना का उपयोग करता हूं (अन्यथा मैं नहीं जानता कि f क्या है)। फिर फिर, आप कभी भी बड़े कार्यों क्यों लिखेंगे?

हालांकि, यदि आप अपने 'सहायक' फ़ंक्शन को निर्यात करना चाहते हैं क्योंकि यह अन्य लोगों के लिए उपयोगी हो सकता है, मैं इसे कहता हूं:

reverseAccumulator

zipWith के zip और zip की तरह लेकिन मैं उन 'सहायक' कार्यों को नहीं zipWith , zip केवल एक जेनेरिक फ़ंक्शन है और zip डिफ़ॉल्ट कार्यान्वयन है (संभवत: वह सबसे ज्यादा इस्तेमाल होता है)।


मैं श्रीवत्स के साथ भी सहमत हूं, इस उदाहरण में मैं सहायक को एक निजी समारोह बनाऊंगा।

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


आप सहायक समारोह को कॉल कर सकते हैं जिसे आप चाहते हैं, और जब तक आप "वैश्विक" नामस्थान में सहायक फ़ंक्शन नहीं डालते तब तक कोई फर्क नहीं पड़ेगा बस एक "प्राइम" जोड़ना एक सामान्य अभ्यास लगता है :) उदाहरण के लिए, हास्केल में,

reverse :: [a] -> [a]
reverse = reverse' []
    where reverse' :: [a] -> [a] -> [a]
          reverse' result [] = result
          reverse' result (x:xs) = reverse' (x:result) xs

मैं हमेशा do_ का उपयोग करता हूँ, जैसे "do_compute" "compute" के साथ मुझे यह काफी वर्णनात्मक लगता है क्योंकि यह कारगर ढंग से कार्य करने वाले कार्य का हिस्सा है, जबकि "गणना" जिसे कहा जाता है कि बाहरी दुनिया के लिए एक सरल वर्णनात्मक नाम होना चाहिए।


मैं aux या foo_aux (मुख्य फ़ंक्शन foo ) का उपयोग करता हूं, और परिभाषा में घोंसला करता foo_aux , इसलिए यह बाह्य रूप से दृश्यमान नहीं है।





helper-functions