2011-11-08 16 views
10

Parsec combinators मैं उपयोग से कई तरह के रूप में एक प्रकार के होते हैं:Parsec इकाई अंतर्निहित

foo :: CharParser st Foo 

CharParser परिभाषित किया गया है here के रूप में:

type CharParser st = GenParser Char st 

CharParser इस प्रकार GenParser से जुड़े एक प्रकार पर्याय है, जो अपने आप परिभाषित here के रूप में:

type GenParser tok st = Parsec [tok] st 

GenParser तो एक और प्रकार पर्याय, Parsec का उपयोग कर सौंपा, के रूप में परिभाषित किया गया है here:

type Parsec s u = ParsecT s u Identity 

तो Parsec के एक आंशिक आवेदन है, जो अपने आप सूचीबद्ध here प्रकार के साथ:

data ParsecT s u m a 

शब्दों के साथ :

"पारसीटी सुमा सेंट के साथ एक पार्सर है रीम प्रकार एस, यूजर स्टेट टाइप यू, अंतर्निहित मोनाड एम और रिटर्न टाइप ए। "

अंतर्निहित मोनाड क्या है? विशेष रूप से, जब मैं CharParser पार्सर्स का उपयोग करता हूं तो यह क्या होता है? मैं नहीं देख सकता कि यह ढेर में कहां डाला गया है। क्या Monadic Parsing in Haskell में सूची मोनैड के उपयोग के साथ एक संदिग्ध पार्सर से कई सफल पार्स लौटने के लिए कोई संबंध है?

उत्तर

6

जेनपार्सर परसेक के संदर्भ में परिभाषित किया गया है, पारसीटी नहीं। बदले में पारसेक तो जवाब है कि जब CharParser का उपयोग कर अंतर्निहित इकाई पहचान इकाई है

type Parsec s u = ParsecT s u Identity 

के रूप में परिभाषित किया गया है।

+1

धन्यवाद, मैंने अपना प्रश्न उस चरण को शामिल करने के लिए संपादित किया। तो यह मोनाड ट्रांसफार्मर का आधार है। मेरा मानना ​​है कि हटन/मीजर पेपर में वर्णित संदिग्ध पार्सिंग से कोई संबंध नहीं है। तो क्या सूची मोनैड का उपयोग Parsec पार्सर के भीतर कहीं भी दिखाई देता है? पारसी केवल गैर अस्पष्ट है? यदि हां, तो क्या यह 'हो सकता है' या 'या तो' का उपयोग करके एन्कोड किया गया है? – user2023370

+1

अंतर्निहित मोनड का प्रयोग पार्ससी द्वारा स्वयं नहीं किया जाता है, इसलिए यह अस्पष्टता को प्रभावित नहीं करता है। – augustss

+0

मुझे लगता है कि मैं जो पूछने की कोशिश कर रहा था वह हटन/मीजर पेपर में सूची मोनाड के बीच संबंध था; और [उपभोग] (http://hackage.haskell.org/packages/archive/parsec/latest/doc/html/Text-Parsec-Prim.html#t: समेकित) और [उत्तर] (http: // हैकेज .haskell.org/पैकेज/संग्रह/parsec/नवीनतम/डॉक्टर/एचटीएमएल/पाठ-पारसी-Prim.html # टी: उत्तर) Parsec में इस्तेमाल प्रकार। – user2023370

7

आपके मामले में अंतर्निहित मोनड Identity है। हालांकि ParsecT अधिकांश मोनड ट्रांसफार्मर से अलग है जिसमें यह Monad वर्ग का उदाहरण है, भले ही प्रकार पैरामीटर m नहीं है। यदि आप स्रोत कोड देखते हैं तो आपको उदाहरण घोषणा में "(Monad m) =>" की कमी दिखाई देगी।

तो फिर आप खुद से पूछें, "अगर मुझे एक गैर-तुच्छ मोनाड स्टैक होना था, तो इसका उपयोग कहाँ किया जाएगा?"

कि प्रश्न के उत्तर के लिए एक तीन के होते हैं:

  1. यह uncons धारा से बाहर अगले टोकन के लिए प्रयोग किया जाता है:

    class (Monad m) => Stream s m t | s -> t where 
        uncons :: s -> m (Maybe (t,s)) 
    

    सूचना है कि uncons एक s (धारा लेता है टोकन t) और इसके परिणाम को आपके मोनड में लपेटा जाता है। यह अगली टोकन प्राप्त करने की प्रक्रिया के दौरान या यहां तक ​​कि दिलचस्प चीज़ करने की अनुमति देता है।

  2. इसका उपयोग प्रत्येक पार्सर के परिणामी आउटपुट में किया जाता है।इसका मतलब है कि आप पार्सर्स बना सकते हैं जो इनपुट को स्पर्श नहीं करते हैं लेकिन अंतर्निहित मोनैड में कार्रवाई करते हैं और संयोजकों को नियमित पार्सर्स से बांधने के लिए उपयोग करते हैं। दूसरे शब्दों में, lift (x :: m a) :: ParsecT s u m a

  3. अंत में, RunParsecT और दोस्तों के अंतिम परिणाम (जब तक आप बिंदु जहां mIdentity की जगह करने के लिए का निर्माण) उनके परिणाम इस इकाई में लिपटे लौट आते हैं।

इस मोनड और Monadic Parsing in Haskell से कोई संबंध नहीं है। इस मामले में हटन और मीजर पारसेक के लिए मोनाड उदाहरण का जिक्र कर रहे हैं। तथ्य यह है कि पारसी-3.0.0 और पारसीटी से परे एक अंतर्निहित मोनैड के साथ एक मोनड ट्रांसफार्मर बन गया है कागज के लिए प्रासंगिक नहीं है।

मुझे लगता है कि आप जो खोज रहे हैं वह वही है जहां संभावित परिणामों की सूची गई थी। हटन और मीजर में पार्सर सभी संभावित परिणामों की एक सूची देता है जबकि पारसेक जिद्दी रूप से केवल एक लौटाता है। मुझे लगता है कि आप परिणाम में m देख रहे हैं और खुद को सोच रहे हैं कि परिणामों की सूची कहीं और छिपी जानी चाहिए। यह नहीं।

दक्षता के कारणों के लिए पारसीक ने हटन और मीजर की परिणामों की सूची में पहले मिलान के परिणाम को प्राथमिकता देने का विकल्प चुना। इसने यह अप्रयुक्त परिणामों को हटन और मीजर की सूची में पूंछ और टोकन की धारा के सामने भी फेंक दिया क्योंकि हम कभी पीछे नहीं हटते हैं। पारसी में, संयुक्त पार्सर a <|> b दिया गया, यदि a किसी भी इनपुट का उपभोग करता है b का मूल्यांकन कभी नहीं किया जाएगा। इसके आसपास का रास्ता try है जो राज्य को रीसेट करेगा जहां a विफल रहता है तो b का मूल्यांकन करें।

यदि आप Maybe या Either का उपयोग करके किया गया था तो आपने टिप्पणियों में पूछा था। जवाब "लगभग लेकिन काफी नहीं है।" यदि आप कम लीवर run* फ़ंक्शंस देखते हैं तो आप देखते हैं कि वे एक बीजगणितीय प्रकार लौटाते हैं जो बताता है कि मौसम इनपुट का उपभोग किया गया था, फिर दूसरा जो परिणाम या त्रुटि संदेश देता था। ये प्रकार Either की तरह काम करते हैं, लेकिन यहां तक ​​कि उनका उपयोग सीधे नहीं किया जाता है। इसके बजाय इसे आगे बढ़ाएं, मैं आपको the post पर एंटोनी लेटर द्वारा संदर्भित करता हूं जो बताता है कि यह कैसे काम करता है और यह इस तरह क्यों किया जाता है।

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