2012-10-25 17 views
9

कोई मुझे समझने में मदद कर सकता है कि पारसी पार्सर्स लिखने के लिए आवेदक शैली का उपयोग कैसे करें?पारसी और आवेदक शैली

module Main where 
import Control.Applicative hiding (many) 
import Text.Parsec 
import Data.Functor.Identity 
data Cmd = A | B deriving (Show) 

main = do 
    line <- getContents 
    putStrLn . show $ parseCmd line 

parseCmd :: String -> Either ParseError String 
parseCmd input = parse cmdParse "(parser)" input 

cmdParse :: Parsec String() String 
cmdParse = do 
    slash <- char '/' 
    whatever <- many alphaNum 
    return (slash:whatever) 

cmdParse2 :: String -> Parsec String() String 
cmdParse2 = (:) <$> (char '/') <*> many alphaNum 

लेकिन जब मैं इसे संकलित करने के लिए प्रयास करते हैं, मैं निम्नलिखित हो:

/home/tomasherman/Desktop/funinthesun.hs:21:13: 
    Couldn't match expected type `Parsec String() String' 
       with actual type `[a0]' 
    Expected type: a0 -> [a0] -> Parsec String() String 
     Actual type: a0 -> [a0] -> [a0] 
    In the first argument of `(<$>)', namely `(:)' 
    In the first argument of `(<*>)', namely `(:) <$> (char '/')' 
Failed, modules loaded: none. 

विचार यह है कि मैं cmdParse2 एक ही बात है कि cmdParse करता है क्या करना चाहते हैं, लेकिन का उपयोग कर इस कोड को मेरे पास है है आवेदक सामान ... मेरा दृष्टिकोण शायद पूरी तरह गलत है, मैं हैकेल

+0

आपका त्रुटि है जैसे कि आप लिखा था '(++) <$> ...' 'नहीं (:) <$> ...'। – huon

+0

क्षमा करें, तय करें .. मैं इसे ++ और दोनों के साथ कोशिश कर रहा था: और इसे मिश्रित मिला – Arg

+4

अच्छी तरह से शोध किए गए प्रश्नों में परम, क्योंकि जवाब "ठीक है, ध्वनि पसंद, सही ढंग से किया गया है, लेकिन इस मामूली प्रकार की त्रुटि को ठीक करें । " +1 – AndrewC

उत्तर

4

आपका आवेदक उपयोग स्पॉट पर है, आपके पास अभी गलत हस्ताक्षर है। प्रयास करें:

cmdParse2 :: Parsec String() String 
+1

बेवकूफ मुझे धन्यवाद, धन्यवाद – Arg

+0

बस एक त्वरित सवाल है, क्या 'कई अल्फानाम' से टेक्स्ट टाइप करना संभव है? इसलिए यदि मैं स्ट्रिंग के बजाय टेक्स्ट का उपयोग करना चाहता हूं तो मैं इसे मैन्युअल रूप से पैक नहीं करता हूं? – Arg

+0

@ एआरजी 1. हां। आप कन्वर्ट कर सकते हैं: '(पैक <$> कई अल्फानाम)', लेकिन आपको सबकुछ बदलने की आवश्यकता होगी: 'cmdParse3 = cons <$> char '/' <*> (पैक <$> कई अल्फानाम) 'लेकिन यह बेहतर लिखा गया है' cmdParse4 = पैक <$> cmdParse2' , और यह बेहतर हो सकता है, आपके आवेदन के अंत तक इसे छोड़ने के लिए और '<$> myTopLevelParser' पैक करें। (स्रोत स्रोत को बदलने के लिए आपको 'Text.Parsec.Text' में रुचि हो सकती है।) 2. क्यों? आप एक समय में एक चरित्र को तार बना रहे हैं, उन्हें अच्छे तरीके से जोड़ रहे हैं। वैसे भी पाठ के लिए _ app (n) _ है। – AndrewC

4

आपका दृष्टिकोण मेरे लिए सही दिखता है, समस्या यह है कि cmdParse2 में गलत प्रकार है। यह cmdParse जैसा ही होना चाहिए। वैसे, आप आवेदक शैली पार्सर में char '/' के आसपास माता-पिता को छोड़ सकते हैं।

+0

शांत, माता-पिता टिप – Arg

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

  • कोई संबंधित समस्या नहीं^_^