10

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

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" बस अजीब है।

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

+0

वह भाषा क्या है? –

+0

मुझे खेद है। मैं अभी एक हास्केल परियोजना पर काम कर रहा हूं, जिसने इस सवाल को प्रेरित किया। मुझे लगता है कि मैं एक पाइथन/जावा उदाहरण दे सकता था, हालांकि इस तरह के सहायक कार्यों अनिवार्य भाषाओं में उपयोगी नहीं हैं। – Cybis

उत्तर

3

मैं अंत करने के लिए "_recurse" जोड़ने के लिए करते हैं। तो "रिवर्स_रेस्कर्स"। यकीन नहीं है कि मुझे यह कहां से मिला। मुझे आपके मामले में मूल केस फ़ंक्शन को सरल छोड़ना पसंद है। यह "सार्वजनिक" कार्य होता है और यह तथ्य कि यह पुनरावृत्ति करने के लिए एक सहायक कार्य का उपयोग करता है, कॉलर के लिए अप्रासंगिक है। जावास्क्रिप्ट में मैं कभी-कभी एक बंद होने के माध्यम से पुनरावृत्ति समारोह को छिपाने के लिए जाता हूं, इसे वास्तव में स्पष्ट करने के लिए इसे सीधे नहीं कहा जाता है।

+0

"_recurse" - यह एक अच्छा है। – Cybis

1

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

उदाहरण:

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

फ़ंक्शन सार्वजनिक होने पर जो कुछ भी सेटअप एक भयानक नाम है। – Cybis

+0

@ [साइबीस]: यह इंगित किया जाना चाहिए कि आप उचित वर्णनात्मक शब्द के साथ "जो कुछ भी" को प्रतिस्थापित करते हैं, उदा। विजेटसेट, विजेटएक्सक्यूट, आदि –

+0

स्टीवन: मुझे लगता है कि उनका मुद्दा यह था कि "सेटअप" निर्यात किए गए कार्यों के लिए एक अच्छा प्रत्यय नहीं है। – Bladt

5

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

21

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

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

मैं ShreevatsaR से सहमत हैं, यदि आप सहायक समारोह उच्च-स्तरीय बनाने नहीं है (या बुरा, निर्यात सूची में रख), की तुलना में यह बात नहीं है क्या इसका नाम है। मैं सहायक कार्यों f और g पर कॉल करता हूं।

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

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

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

reverseAccumulator 

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

+0

मुझे प्रधान (रेव -> rev '= श्रीवात्सआर सुझाव के रूप में उपयोग करना पसंद है, लेकिन मुझे लगता है कि यह सामान्यता के कारण स्वीकार्य उत्तर होना चाहिए और क्योंकि यह पुस्तकालयों में सम्मेलनों से संबंधित है। – Bladt

2

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

3

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

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

संबंधित मुद्दे