2012-03-18 14 views
6

कल्पना कीजिए कि आपको अनुक्रम पर गुना करने की आवश्यकता है, और सीमा के साथ कई बिंदुओं पर मध्यवर्ती मूल्यों को भी जानना चाहते हैं।तह और पुनरावृत्ति के इस पैटर्न क्या है?

[a,b,c] = map fst . tail $ chain [g i, g j, g k] (zero, sequence) 

g :: Integer -> (a,b) -> (a,b) 

chain (f:fs) x = x : chain fs (f x) 
chain [] x = [x] 

समारोह g, (लंबाई i, j की, आदि) एक इनपुट अनुक्रम के एक निर्धारित हिस्से की खपत कुछ प्रारंभिक मूल्य के साथ शुरू और एक ही के परिणामों का निर्माण: यह क्या मैं इस के लिए उपयोग किया है है अगले आमंत्रण में खिलाया जाने के लिए टाइप करें। प्रारंभ से शुरू होने वाली अलग-अलग लंबाई के लिए अनुक्रम को कई बार उपभोग करना और प्रारंभिक मूल्य निश्चित रूप से अक्षम और समय-समय पर अक्षम होगा।

तो एक तरफ हम पूर्णांक के इस अनुक्रम पर गुना - अनुक्रम पर अंतरिम बिंदु; दूसरी तरफ हम इस समारोह को फिर से सक्रिय करते हैं, g। यह क्या है? क्या मैं यहाँ कुछ बुनियादी याद कर रहा हूँ? क्या इसे किसी भी तरह फोल्ड इत्यादि के नियमित प्रदर्शन के साथ व्यक्त किया जा सकता है?

संपादित करें:   हल:   ऊपर बस

[a,b,c] = map fst . tail $ scanl (flip g) (zero, sequence) [i, j, k] 

दिलचस्प है कि कैसे एक परिवर्तनीय यात्रा वास्तव में है संशोधक की सूची पर तह है।

+6

क्या आप मूल रूप से स्कैनल का मतलब रखते हैं? http://www.haskell.org/hoogle/?hoogle=scanl – Marcin

+1

@ मार्सिन आह, हाँ, मूलभूत सामग्री। शायद हाँ। मुझे क्या उलझन में था कि 'जी' स्वयं अनुक्रम पर भी गुजरता है। मुझे लगता है कि स्कैनिंग फ़ंक्शन 'i' के साथ '(शून्य, अनुक्रम) 'को जोड़ देगा और सीधे' [i, j, k] 'सूची को स्कैन करेगा ... धन्यवाद, कोशिश करूँगा! –

उत्तर

9

scanl का प्रयास करें: http://www.haskell.org/hoogle/?hoogle=scanl

scanl foldl के समान है, लेकिन बाएं से लगातार कम हो मानों की सूची देता है:

scanl f z [x1, x2, ...] == [z, z `f` x1, (z `f` x1) `f` x2, ...] 

ध्यान दें कि

last (scanl f z xs) == foldl f z xs 
4

विस्तृत करने के लिए मार्सिन की टिप्पणी है, तो आप मूल रूप से चाहते हैं:

intermediates = scanl step zero sequence 
map (\n -> intermediates !! n) [i, j, k] 

stepg नहीं है, बल्कि सिर्फ g की बात यह है कि सूची sequence की एक एकल तत्व खपत करता है।

इसके अलावा, मार्किन को सही उत्तर के रूप में स्वीकार करें।

+0

अनुक्रम स्वयं विशाल है (अच्छा, * बड़ा *), और मुझे केवल दो मध्यवर्ती और एक फाइनल की आवश्यकता है। यह पूरी बात अंतरिक्ष की खपत को कम करना और ghc को जितना संभव हो उतना सामान से छुटकारा पाने का मौका देना है। इसके अलावा, मैंने आपकी पोस्ट से 5 मिनट पहले स्वीकार किया था। :) धन्यवाद! –

+0

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

+0

मुझे संदेह है कि '(!! एन)' पूरे अनुक्रम के अस्तित्व की मांग करेगा क्योंकि इसे शुरुआत से गिनना शुरू करना होगा। लेकिन मैं बाद में कोशिश करूँगा, धन्यवाद।अगले एक के उत्पादन के लिए प्रत्येक पिछले मूल्य की आवश्यकता है; भले ही इसकी आवश्यकता नहीं है, यह बहुत सी (जीसी) गतिविधि है, और सूची अभी भी बनाए रखा जाएगा, इसलिए यह प्रत्येक नोड के मूल्य को भी मुक्त नहीं कर सकता क्योंकि यह पहले से ही मजबूर था। कदमों की गणना करते समय, जो वास्तव में टाला जाता है, उम्मीद है। मैंने वास्तव में अपने दृष्टिकोण के साथ अंतरिक्ष आकार में एक महत्वपूर्ण गिरावट देखी। –

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