2014-09-25 7 views
6

यह बहुत आम है जहां मैं xs तत्वों की कुछ सूची में आया हूं और प्रत्येक एनएच तत्व के साथ कुछ करने के लिए कुछ करना चाहता हूं। सबसे सरल उदाहरण चाइव या एरास्टोथेनेस होगा, जहां आप किसी दिए गए प्राइम के प्रत्येक बहुमत को "दस्तक देना" चाहते हैं। मैं इसे दो तरीकों से कर सकता हूं, एक काउंटर वेरिएबल के साथ गुजरने वाला स्पष्ट रिकर्सन होगा; या zipWith ($) (cycle (replicate (n-1) id ++ f))। तो किस तरह से बेहतर/अधिक सुरुचिपूर्ण/अधिक सामान्य रूप से उपयोग किया जाता है, या क्या कुछ लाइब्रेरी फ़ंक्शन mapEveryN :: (a -> a) -> Int -> [a] -> [a] है जो मुझे नहीं मिला है?हास्केल में, सूची के प्रत्येक एनएच तत्व में फ़ंक्शन को लागू करने का सबसे आम तरीका क्या है?

+3

ठीक है, आप 'ज़िप ($) ($ 1 $ चक्र $ f: प्रतिलिपि (एन -1) आईडी) ड्रॉप कर सकते हैं, जो मेरे लिए बहुत सुंदर लग रहा है। कोई स्पष्ट रिकर्सन नहीं है, आप concatenation से बचें और इसके बजाय ':' का उपयोग करें, और यह 1-लाइनर है। – bheklilr

+1

आप किसी भी इंटरमीडिएट सूची को 'piecesOf n = unfoldr (बस। SplitAt n)' के साथ भी प्राप्त कर सकते हैं, फिर इसके साथ 'concatMap'। शायद अन्य विधियों के रूप में कम और कुशल नहीं है लेकिन कभी-कभी सुविधाजनक भी हो सकता है। –

+0

@ एनएम। 'piecesOf'' n' के समूह बनाता है, उसके बाद उस समूह के बाद जो 'n' से कम हो सकता है, उसके बाद रिक्त समूहों की अनंत संख्या होती है। – pat

उत्तर

2

जैसा कि आप और भेलिलर उल्लेख करते हैं, cycle इसे पूरा करने का एक अच्छा तरीका प्रदान करता है। आप थोड़ा हालांकि आलस्य का लाभ ले सकते:

mapEvery :: Int -> (a -> a) -> [a] -> [a] 
mapEvery n f = zipWith ($) (drop 1 . cycle . take n $ f : repeat id) 

zipWith और cycle के उपयोग अधिक मुहावरेदार एक हाथ से लिखा पुनरावर्ती क्रिया है कि दोनों कार्यों को जोड़ती है की तुलना में (जटिल सरल व्यवहार से बना व्यवहार) लगता है।

नोट: tail यहां इस समारोह n = 0 के लिए अपरिभाषित तो drop 1 बेहतर है बनाता है।

इसके लिए लाइब्रेरी फ़ंक्शन नहीं है जिसके बारे में मुझे पता है।

+2

किसी सूची के प्रत्येक 0 वें तत्व को कुछ करना संभवतः बकवास है, इसलिए उस मामले में फ़ंक्शन विफल होने के लिए बेहतर है। यदि किसी विशेष संदर्भ में यह समझ में आता है, आपको यह पता लगाना चाहिए कि एन = 0 के लिए उचित व्यवहार क्या है, "सुरक्षा" के नाम पर कुछ मनमानी तरीके से फ़ंक्शन को कुल मिलाकर नहीं। सौभाग्य से चक्र [] पहले से ही एक त्रुटि है, इसलिए 1 को छोड़ने वाली पूंछ को कोई प्रभाव नहीं पड़ता है। –

+0

@ रीडबर्टन अच्छा बिंदु –

+0

'प्रतिकृति' को 'टेक' पर स्विच करने के लिए अच्छा काम। मुझे लगता है कि यह क्लीनर है, मैं इसका इस्तेमाल करूंगा। धन्यवाद। –

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

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