2012-07-03 18 views
14

मैं & तीर के साथ काम करने की कोशिश कर रहा हूं, और मुझे कुछ कठिनाई हो रही है। मेरे पास एक संदर्भ है जहां मुझे Arrow [a] [b] की आवश्यकता है, और मैं Arrow a b लिखना चाहता हूं और तीर के अंदर नक्शा/अनुक्रम, एक ला mapM लिखना चाहता हूं। विशेष रूप से, तीर एक Hakyll Compiler है, लेकिन मुझे नहीं लगता कि उत्तर के लिए बहुत मायने रखता है।मानचित्र एम के बराबर तीर एम?

एक तीर

myInnerArrow :: Arrow a => a b c 

मैं कैसे एक तीर

myOuterArrow :: Arrow a => a [b] [c] 

में इस उठा सकते हैं को देखते हुए?

मैंने बेस लाइब्रेरी को विशेष रूप से Data.List और Control.Arrow में खराब कर दिया है, लेकिन मुझे ऐसा कुछ भी नहीं मिल रहा है जो ऐसा लगता है कि यह काम करेगा। क्या यह एक ऐसे नाम के तहत मौजूद है जो मुझे उम्मीद नहीं है? क्या यह किसी अन्य पुस्तकालय द्वारा प्रदान किया जाता है? क्या किसी कारण से लिखना असंभव है?

+0

अनुवर्ती: Hakyll का 'mapCompiler' फ़ंक्शन है। –

उत्तर

14

आप बिना किसी विकल्प के कर सकते हैं।

mapA :: (ArrowChoice a) => a b c -> a [b] [c] 

लागू करने के लिए सबसे आसान तरीका है proc अंकन का उपयोग कर रहा है: उठाने समारोह इस प्रकार होगा

mapA c = 
    proc xs' -> 
     case xs' of 
      [] -> returnA -< [] 
      (x:xs) -> uncurry (:) ^<< c *** mapA c -< (x, xs) 

Untested कोड है, लेकिन काम करना चाहिए। ध्यान दें कि जेनेरिक एक समारोह वास्तव में धीमा होने जा रहा है। मैं विशेष रूप से आपके तीर के लिए इस मैपिंग फ़ंक्शन को लिखने की अनुशंसा करता हूं।

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