2017-01-07 12 views
5

Traversable एक अर्थ में उन कंटेनरों की श्रेणी है जिनकी संरचना में "पथ" है (जो एक सूची के अनुरूप हो सकता है), जिन तत्वों को संरचना को भंग किए बिना संशोधित किया जा सकता है। इसलिएकिसी सूची के साथ ट्रैवर्स करने के लिए सबसे मानक/सामान्य तरीका क्या है?

zipTrav :: Traversable t => t a -> [b] -> Maybe (t (a,b)) 
zipTrav = evalStateT . traverse zp 
where zp a = do 
      bs <- get 
      case bs of 
       [] -> lift Nothing 
       (b:bs') -> put bs' >> return (a,b) 

हालांकि, यह सूची-राज्य ट्रैवर्सल थोड़ा हैकिश लगता है और संभवतः ऐसा करने का सबसे प्रभावी तरीका नहीं है। मुझे लगता है कि उपरोक्त या अधिक सामान्य कार्य पूरा करने वाला एक मानक कार्य होगा, लेकिन मैं यह नहीं समझ सकता कि यह क्या होगा।

उत्तर

5

mapAccumL/mapAccumR के बारे में क्या?

tzipWith :: Traversable t => (a -> b -> c) -> [a] -> t b -> Maybe (t c) 
tzipWith f xs = sequenceA . snd . mapAccumL pair xs 
    where pair [] y = ([], Nothing) 
      pair (x:xs) y = (xs, Just (f x y)) 

tzip :: Traversable t => [a] -> t b -> Maybe (t (a, b)) 
tzip = tzipWith (,) 

ghci> tzip [1..] [4,5,6] 
Just [(1,4),(2,5),(3,6)] 

ghci> tzip [1,2] [4,5,6] 
Nothing 

दक्षता के सवाल पर - under the hoodmapAccum कार्यों राज्य इकाई का उपयोग करें, ताकि सभी मैं वास्तव में किया है एक उच्च क्रम समारोह में अपने कोड की अनिवार्यता भाग पर कब्जा है। मैं इस कोड को आपके से बेहतर प्रदर्शन करने की उम्मीद नहीं करूंगा। लेकिन मुझे नहीं लगता कि आप State मोनैड (या ST) से अधिक बेहतर कर सकते हैं, केवल Traversable t दिए गए हैं।

+0

@WillNess नाह, आपको सिर्फ यह जांचने की आवश्यकता है कि ट्रैवर्सिंग समाप्त होने के बाद इनपुट सूची में कुछ भी बचा है या नहीं। मैं अपना कोड –

+0

@WillNess अपडेट करूंगा, मुझे लगता है कि यदि 'ट्रैवर्सबल' भरने के लिए सूची में पर्याप्त आइटम नहीं हैं तो प्रश्नकर्ता 'कुछ भी नहीं' वापस करना चाहता है। विचार –

+0

आह मानों को जोड़ते समय इनपुट 'ट्रैवर्सबल' के आकार को रखना है, यह समझ में आता है। इसका मतलब है कि आपका पिछला संस्करण वास्तव में सही था। :) मैंने आपके पिछले संस्करण को बहाल कर दिया है, और एक स्पष्टीकरणपूर्ण उदाहरण जोड़ा है। इसके लिए क्षमा करें। –

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

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