आप एक विशेष रूप से कुंठित आलसी प्राकृतिक संख्या के रूप में अपनी सूची का इलाज द्वारा reverse . take n . reverse
बदल सकता है। सूचियों के रूप में एन्कोड आलसी प्राकृतिक की तुलना के लिए, घटाव drop
है:
type LazyNat a = [a]
lengthLazy :: [a] -> LazyNat a
lengthLazy = id
dropLazy :: LazyNat a -> [b] -> [b]
dropLazy [] xs = xs
dropLazy (_:n) (_:xs) = dropLazy n xs
dropLazy _ _ = []
-- like Prelude.subtract, this is flip (-)
subtractLazy :: Int -> LazyNat a -> LazyNat a
subtractLazy = drop
अब हम आसानी से "ले पिछले n
" समारोह को लागू कर सकते हैं:
takeLast n xs = dropLazy (subtractLazy n (lengthLazy xs)) xs
... और आप को पता है कि खुश हो जाएगा केवल n
किसी भी समय पर विपक्ष को स्मृति में होना आवश्यक है। विशेष रूप से, takeLast 1
(या वास्तव में किसी भी takeLast N
शाब्दिक N
के लिए) लगातार स्मृति में चला सकते हैं। आप की तुलना क्या होता है जब आप क्या होता है जब आप GHCi में (reverse . take 5 . reverse) [1..]
चलाने के साथ takeLast 5 [1..]
चलाने कर इसकी पुष्टि कर सकते हैं।
बेशक
, मैं ऊपर बहुत विचारोत्तेजक नाम का उपयोग करने की कोशिश की है, लेकिन कोई वास्तविक कार्यान्वयन में आप सब बकवास ऊपर इनलाइन सकता है:
takeLast n xs = go xs (drop n xs) where
go lastn [] = lastn
go (_:xs) (_:n) = go xs n
go _ _ = []
स्रोत
2013-03-18 04:52:59
यकीन है कि क्या आप के बाद कर रहे हैं नहीं। एक पुनर्लेखन नियम यह कर सकता है, अगर वह आप जो चाहते हैं उसके करीब पर्याप्त है। –
@DanielFischer: मैं नहीं बल्कि इस को हल करने के लिए एक सामान्य विधि में दिलचस्पी है। दूसरे उदाहरण के बारे में सोचो। – false
यदि यह अभी भी आपकी रूचि रखता है, तो उत्तर इस बात पर निर्भर करता है कि सूची में कितने उपभोक्ता हैं; यदि 'अंतिम 'केवल एकमात्र है, तो इसे निरंतर स्थान और ओ (एन) समय में चलाना चाहिए; लेकिन अगर कुछ अन्य उपभोक्ता इस सूची का संदर्भ रखते हैं, तो यह आखिरी सेल में समाप्त होने पर 'आखिरी' बताए जाने पर अस्तित्व में आ जाएगा। इस प्रकार ओ (एन) अंतरिक्ष और समय। इसी तरह डैनियल वाग्नेर के जवाब में दिखाए गए 'टेकलास्ट' के लिए। - या हम सूचियों के * वास्तविक कार्यान्वयन * को बदल सकते हैं, स्पष्ट परिणामों के साथ कुंजी के रूप में उपयोग किए गए इंडेक्स के साथ स्वयं-संतुलित पेड़ के रूप में।क्लोजर उच्च शाखा कारक (32?) के साथ भी चतुर पेड़ का उपयोग करता है। –