2011-12-11 15 views
5

मैं हास्केल में तीर सीखने की कोशिश कर रहा हूं, इसलिए मैं एक्सएमएल के लिए तीर आधारित एचएफटी लाइब्रेरी के साथ एक साधारण एप्लिकेशन लिख रहा हूं। HXT विकीज़ और ट्यूटोरियल में उदाहरण फ़ंक्शन प्रकार हस्ताक्षर को छोड़ दें। हालांकि, मैं बहुत प्रकार के शौकीन हूं और उनको कैसे उपयोग करना है, यह जानने की कोशिश कर रहा हूं। यह वह जगह है जहां मैंने एक ठोकर खाई से मुलाकात की है।तीर/एचएफटी और टाइप हस्ताक्षर

readXml str = runX (readString [withValidate no] str) 

atTag tag = deep (isElem >>> hasName tag) 

मैं समझ वे निम्नलिखित हस्ताक्षर सौंपा जाना चाहिए: इन कार्यों को देखते हुए

readXml ∷ String → IO [XmlTree] 

atTag ∷ ArrowXml a ⇒ String → a XmlTree XmlTree 

मैं इस तरह के रूप में इन का उपयोग कर एक साथ तीर वाक्य रचना हुक करने की कोशिश कर रहा हूँ:

parseItem = proc str -> do 
    desc <- text <<< atTag "description" <<< arr readXml -< str 
    ... 

हालांकि, अगर मेरे मेरे प्रकार के हस्ताक्षर सही हैं (जीएचसी ने शिकायत नहीं की है), मुझे XmlTree प्राप्त करने औरपर वापस लाने के लिए मोनाड सिंटैक्स और तीर सिंटैक्स को गठबंधन करने के लिए एक तरीका चाहिए।

मुझे यकीन है कि कैसे आगे बढ़ना है। किसी के पास कोई अंतर्दृष्टि है?

उत्तर

3

readXml की परिभाषा में runX का उपयोग करते हुए एक समारोह में एक तीर "रूपांतरित", और parseItem की परिभाषा में arr का उपयोग कर कि समारोह एक तीर में वापस फिर से बदल देता है। अब, ऐसा करने से यह ठीक होगा, सिवाय इसके कि readStringIOStateArrow (IOSLA - आईओ स्टेट लिस्ट एरो) के लिए एक विशेष प्रकार उपनाम देता है, जिसे न केवल Arrow के रूप में माना जाना चाहिए, लेकिन अधिक विशेष रूप से IOArrow के रूप में माना जाना चाहिए; इस बीच, आप arr का उपयोग कर इसे फिर से भरकर शुद्ध Arrow के रूप में इसका इलाज कर रहे हैं। ताकि readXml :: String -> IOStateArrow s b XmlTree

  1. readXml = readString [withValidate no] बनाएं:

    आप यहाँ दो विकल्प हैं। फिर आप parseItem में कर सकते हैं।

  2. एक आईओ तीर में readXml को उठाने के लिए arrIO का उपयोग करें, जो आपको इसका इच्छित तरीका उपयोग करने देता है।

मैं इस मामले में विकल्प 1 का उपयोग करूंगा, क्योंकि यह तीर-रैपिंग-अनैपिंग करने के लिए अनिवार्य लगता है यदि इसके लिए कोई विशेष कारण नहीं है।

+0

मैं उलझन में हूं। परिदृश्य 1 में, readXml वास्तव में एक तीर नहीं है, बल्कि एक फ़ंक्शन जो तीर देता है। इसका उपयोग तीर सिंटैक्स के साथ कैसे किया जा सकता है जैसे कि यह एक था? – providence

+0

मैं कोड को कॉपी करते समय '- <' को हटाने के लिए भूल गया; यह अब स्पष्ट होना चाहिए। – dflemstr

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