करी का उपयोग करने के लिए मापदंडों का आदेश


93

मापदंडों के क्रम को बदलने के लिए मेरे पास हाल ही में दो बार रिफलेक्ट किए गए कोड हैं क्योंकि बहुत अधिक कोड थे जहां हैक flipया जैसे \x -> foo bar x 42हो रहे थे।

फंक्शन सिग्नेचर डिजाइन करते समय कौन से सिद्धांत मुझे करीने का बेहतरीन उपयोग करने में मदद करेंगे?

जवाबों:


111

आसानी से करीने और आंशिक-अनुप्रयोग का समर्थन करने वाली भाषाओं के लिए, तर्कों की एक सम्मोहक श्रृंखला है, मूल रूप से क्रिस ओकासाकी से:

  • अंतिम तर्क के रूप में डेटा संरचना रखो

क्यों? फिर आप डेटा पर संचालन अच्छी तरह से कर सकते हैं। जैसे insert 1 $ insert 2 $ insert 3 $ s। यह राज्य के कार्यों के लिए भी मदद करता है ।

मानक कंटेनर जैसे "कंटेनर" इस सम्मेलन का पालन करते हैं

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

  • सबसे अलग तर्क पिछले रखो

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


ओकासाकी दृश्य का सारांश उनकी एडिसन लाइब्रेरी (फिर से, एक अन्य डेटा संरचना पुस्तकालय) में दिया गया है:

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

पहली गोली बिंदु के लिए एक कोरोलरी के रूप में, उस तर्क को भी रखें जो डेटा संरचना में पिछले में रह सकता है। यह मैप, फोल्ड और दोस्तों को क्लीनर बनाता है। tl; सूची में ड्रू अंतिम है।
जॉन एफ मिलर

1
लुकअप को वैसे भी जंजीर नहीं बनाया जा सकता है, इसलिए पहला बिंदु एक तरफ का समर्थन नहीं करता है। haskell.org/haskellwiki/Parameter_order एक तर्कपूर्ण तर्क को दूसरे तरीके से बनाता है - "चूंकि टाइप मैप की वस्तुएं मैपिंग का प्रतिनिधित्व करती हैं, इसलिए कुछ फ़ंक्शन का होना स्वाभाविक है जो मैप ऑब्जेक्ट को प्रतिनिधित्व फ़ंक्शन में बदल देता है।"
ब्रैंडन

11

उन तर्कों को रखें जिन्हें आप सबसे पहले पुन: उपयोग करने की संभावना रखते हैं। समारोह तर्क इसके एक महान उदाहरण हैं। आप map fदो अलग-अलग सूचियों से अधिक चाहते हैं, आप एक ही सूची में कई अलग-अलग कार्यों को मैप करना चाहते हैं।


5
यदि आप वास्तव में एक ही सूची में कई कार्यों की मैपिंग कर रहे हैं, तो शायद आपको कार्यों की एक सूची बनानी चाहिए, और map ($myList)इसके बजाय उस सूची पर।
स्क्वीडली

3

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

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