2017-01-19 7 views
10

इस बात पर विचार करते हुए कि सर्वोत्तम मानचित्र कैसे करें, यानी traverse, a -> Maybe a- unboxed vector पर क्लेस्ली, मैंने एक मौजूदा कार्यान्वयन की तलाश की। जाहिर है U.VectorTraversable नहीं है, लेकिन it does supply a mapM, जो कि Maybe के लिए बिल्कुल ठीक काम करता है।आवेदक-ट्रैवर्स सरणी क्यों असंभव है? (या यह है?)

लेकिन सवाल यह है: Monad बाधा वास्तव में जरूरी है? खैर, यह पता चला है कि यहां तक ​​कि boxed vectors cheat for the Traversable instance: वे वास्तव में सिर्फ एक सूची, जो वे परिवर्तित से/को पार:

instance Traversable.Traversable Vector where 
    {-# INLINE traverse #-} 
    traverse f xs = Data.Vector.fromList Applicative.<$> Traversable.traverse f (toList xs) 

mono-traversabledoes the same thing also for unboxed vectors; यहां यह और भी भयानक प्रदर्शन-वार लगता है।

अब, मुझे आश्चर्य नहीं होगा अगर vector वास्तव में इन हैक किए गए ट्रैवर्सल को कई अधिक कुशल रूप में फ्यूज करने में सक्षम था, लेकिन फिर भी - एक मौलिक समस्या प्रतीत होती है, जो हमें एक ट्रैवर्सल को लागू करने से रोकती है सरणी तुरंत क्या इस अक्षमता के लिए कोई "गहरा कारण" है?

+1

'यू.वेक्टर' के उदाहरण की कमी तत्वों पर 'अनबॉक्स' बाधा के साथ है। देखें [* अनबॉक्स किए गए सरणी क्यों फोल्ड करने योग्य नहीं हैं? *] (Http://stackoverflow.com/q/36322904/2751851) (उत्तर, स्नोयमैन द्वारा उत्तर में, * मोनो-ट्रैवर्सबल * के बारे में कुछ प्रासंगिक टिप्पणियां भी शामिल हैं)। – duplode

+3

निश्चित रूप से, लेकिन यह वह नहीं है जो मैं पूछ रहा हूं। मुझे वास्तविक 'ट्रैवर्सबल' उदाहरण की आवश्यकता नहीं है, मुझे बस एक कुशल ट्रैवर्सल की आवश्यकता है! और 'मोनो-ट्रैवर्सबल' यह पेशकश नहीं करता है। – leftaroundabout

+0

ओह - मैंने आपके पहले पैराग्राफ में "स्पष्ट रूप से" नोटिस नहीं किया :) – duplode

उत्तर

2

vector के प्रासंगिक स्रोत के माध्यम से पढ़ रहे हैं और Applicative साथ mapM काम करने की कोशिश कर के बाद मुझे कारण है कि Data.Vector.Unboxed.Vector एक traverse :: (Applicative f, Unbox a, Unbox b) -> (a -> f b) -> Vector a -> f (Vector b) समारोह नहीं है और Data.Vector.Vector एक देशी traverse संलयन कोड है नहीं है लगता है।

-- Data/Vector/Fusion/Stream/Monadic.hs Line: 137 

-- | Result of taking a single step in a stream 
data Step s a where 
    Yield :: a -> s -> Step s a 
    Skip :: s -> Step s a 
    Done :: Step s a 

-- | Monadic streams 
data Stream m a = forall s. Stream (s -> m (Step s a)) s 

यह आंतरिक रूप से प्रयोग किया जाता है mapM लागू करने के लिए: अपराधी निम्नलिखित Stream प्रकार है। m आपके प्रारंभिक कॉल से Data.Vector.Unboxed.mapM जैसा ही होगा। लेकिन चूंकि इस स्ट्रीम की रीढ़ m फ़ैक्टर के अंदर है, इसलिए इसके साथ काम करना संभव नहीं है यदि आपके पास केवल m के लिए आवेदक है।

यह समस्या vector गीटहब रेपो पर भी देखें: Weaken constraint on mapM

अस्वीकरण: मुझे वास्तव में पता नहीं है कि संलयन कैसे काम करता है। मुझे नहीं पता कि कैसे vector काम करता है।

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