2010-01-09 10 views
12

मैं एक सी # लड़का हूं जो खुद को एरिक मीजर के चैनल 9 वेबकास्ट से हास्केल सिखाने की कोशिश कर रहा है। मैं एक दिलचस्प पहेली में आया जिसमें ज़िप और मॉड का उपयोग करके सूची के प्रत्येक 'एन' तत्वों को छोड़ना शामिल था।हास्केल में असीमित दोहराने वाली सूची कैसे बनाएं?

every :: Int -> [a] -> [a] 
every _ [] = [] 
every n xs = [x | (x,i) <- zip xs [1..], i `mod` n == 0] 

मैं सोच रहा है यह (बहुत बड़ी सूची, या नदियों के लिए) और अधिक कुशल अगर हम आधुनिक का उपयोग कर से बचने के सकता है हो सकता है।

मैंने आलसी की दोहराई गई सूची बनाने के बारे में सोचा था ताकि हम आसानी से i से n के मूल्य की तुलना कर सकें।

repeatInts :: Int -> [Int] 

ऐसी है कि फोन करने repeatInts 3 रिटर्न [1,2,3,1,2,3,1,2,3,1,2,3,..] अनंत तक। मेरे सवालों का

every :: Int -> [a] -> [a] 
every _ [] = [] 
every n xs = [x | (x,i) <- zip xs (repeatInts n), i == n] 

तो है::

इस देखते हुए, हम every इसलिए की तरह फिर से परिभाषित कर सकता है कि कैसे आप repeatInts लागू होगा?

+0

सीएफ। http://stackoverflow.com/questions/2026912/how-to-get-every-nth-element-of-an-infinite-list-in-haskell –

उत्तर

17

उपयोग cycle: एक परिपत्र में

cycle :: [a] -> [a] 

cycle संबंधों एक परिमित सूची, या समतुल्य मूल सूची के अनंत पुनरावृत्ति। यह अनंत सूचियों पर पहचान है।

आप cycle के मामले में repeatInts निर्धारित कर सकते हैं:

*Main> let repeatInts n = cycle [1..n] 
*Main> :t repeatInts 
repeatInts :: (Num t, Enum t) => t -> [t] 
*Main> take 10 $ repeatInts 3 
[1,2,3,1,2,3,1,2,3,1] 

उत्सुक के लिए, GHC लागू करता cycle

cycle [] = errorEmptyList "cycle" 
cycle xs = xs' where xs' = xs ++ xs' 

पूरी तरह कार्यात्मक की भाषा में साथ, इस उत्सुक तकनीक जाना जाता है गाँठ बांधकर, एक डी यह अनंत लोगों की बजाय चक्रीय डेटा संरचनाओं बनाता है।

विवरण हास्केल विकी पर देखने

+0

धन्यवाद, gbacon। किसी तरह मुझे पता था कि एक साधारण जवाब होगा! अब मैं 'चक्र' के कामकाज में खोद सकता हूं। –

+0

कुछ हद तक आश्चर्यजनक रूप से, 'चक्र' मानक हैस्केल '9 8 है, भले ही चक्रीय सूचियां न हों। देखें कि स्रोत (उपरोक्त) इसके बारे में क्या कहता है - आपको चक्रीय सूची मिल सकती है या नहीं ... –

+1

मजेदार, यह क्यू/ए स्वयं XY समस्या का एक उदाहरण है। ;) किसी सूची में प्रत्येक एनएच तत्व को छोड़ना किसी भी 'मोड' को शामिल नहीं करना चाहिए, न ही अनंतता की गिनती करना चाहिए। उचित समाधान 'ज़िप' (चक्र $ (0 <$ [2..n]) ++ [1]) के साथ 'ज़िप' के साथ प्रतीत होता है, 'या 'splitAt' के साथ' iterate' के माध्यम से। :) –

2

देर जवाब लेकिन यह टी की तरह भी लिखा जा सकता है उसका:

repeatInts :: Int -> [Int] 
repeatInts 0 = [] 
repeatInts a = [1..a] ++ repeatInts a 
संबंधित मुद्दे