पहले के अंत में कम लोगों के बारे में चिंता किए बिना खिड़कियों मिलता है:
import Data.List (tails)
windows' :: Int -> [a] -> [[a]]
windows' n = map (take n) . tails
> windows' 3 [1..5]
[[1,2,3],[2,3,4],[3,4,5],[4,5],[5],[]]
अब हम कम लोगों से छुटकारा पाने के लिए चाहते हैं लंबाई की जाँच के बिना हर एक का।
जब से हम जानते हैं कि वे अंत में कर रहे हैं, हम उन्हें इस तरह खो सकता है:
windows n xs = take (length xs - n + 1) (windows' n xs)
लेकिन उस महान के बाद से हम अभी भी एक अतिरिक्त समय इसकी लंबाई प्राप्त करने के लिए XS के माध्यम से जाना नहीं है। यह अनंत सूचियों पर भी काम नहीं करता है, जो आपके मूल समाधान ने किया था। भी
windows :: Int -> [a] -> [[a]]
windows n xs = takeLengthOf (drop (n-1) xs) (windows' n xs)
> windows 3 [1..5]
[[1,2,3],[2,3,4],[3,4,5]]
वर्क्स पर अनंत सूचियां:
इसके बजाय चलो एक शासक के रूप में एक सूची का उपयोग मात्रा को मापने के लिए एक और से के लिए एक समारोह लिखें:
takeLengthOf :: [a] -> [b] -> [b]
takeLengthOf = zipWith (flip const)
> takeLengthOf ["elements", "get", "ignored"] [1..10]
[1,2,3]
अब हम यह लिख सकते हैं :
> take 5 (windows 3 [1..])
[[1,2,3],[2,3,4],[3,4,5],[4,5,6],[5,6,7]]
जैसा कि गेब्रियल गोंजालेज कहते हैं, समय जटिलता बेहतर नहीं है यदि आप चाहते हैं पूरे परिणाम का प्रयोग करें। लेकिन अगर आप केवल कुछ खिड़कियों का उपयोग करते हैं, तो अब हम take
और length
के काम करने से बचने के लिए प्रबंधन करते हैं।
या 'फ़ोल्डर (ज़िपविथ (:)) (दोहराना [])। म लो । tails'। –
@Will Ness - ओह अच्छा है – user1441998
@ user1441998 यह है कि 'ज़िपसूची' पर 'अनुक्रम ए' क्या है। :) ("या" मेरा मतलब था "या इसे स्पष्ट रूप से लिखा जा सकता है ...")। ['अनुक्रम ए'] (http://hackage.haskell.org/package/base-4.8.1.0/docs/src/Data.Traversable.html#sequenceA) == [' फ़ोल्डर ((<*>)। ((:) <$>)) (शुद्ध []) '] (http://hackage.haskell.org/package/base-4.8.1.0/docs/src/Data.Traversable.html#line-177)। –