2017-02-16 4 views
11

की तलाश में है, मैं parserspackagedo सिंटैक्स का उपयोग करके एक पार्सर लिखने की कोशिश कर रहा हूं।'पार्सिंग' आवेदक के साथ लागू भाषा भाषा अभी भी मोनाड इंस्टेंस

{-# LANGUAGE ApplicativeDo #-} 
import Text.Parser.Char (string, spaces) 
import Text.Parser.Token (TokenParsing, natural) 

issueParser :: TokenParsing p => p Integer 
issueParser = do 
    spaces 
    string "**Issue:**" 
    spaces 
    string "https://github.com" <|> string "github.com" 
    string "/commercialhaskell/stack/issues/" 
    natural 

त्रुटि GHC मुझे देता है Could not deduce (Monad p) arising from a do statement from the context: TokenParsing p है: यहाँ एक उदाहरण है। यह त्रुटि संदेश सही है कि TokenParsing एक सुपर क्लास के रूप में Monad प्रदान नहीं करता है, हालांकि यह Applicative प्रदान करता है जिसका अर्थ है क्योंकि मेरे पास यह भाषा विस्तार चालू है, मुझे Applicative के साथ do सिंटैक्स का उपयोग करने में सक्षम होना चाहिए। मैं यहाँ क्या गलत/लापता कर रहा हूँ?

उत्तर

14

यह पता लगाया। एक GHC बग यहाँ इसे संबोधित करने

{-# LANGUAGE ApplicativeDo #-} 
import Text.Parser.Char (string, spaces) 
import Text.Parser.Token (TokenParsing, natural) 

issueParser :: TokenParsing p => p Integer 
issueParser = do 
    _ <- spaces 
    _ <- string "**Issue:**" 
    _ <- spaces 
    _ <- string "https://github.com" <|> string "github.com" 
    _ <- string "/commercialhaskell/stack/issues/" 
    n <- natural 
    pure n 

वहां पहले से ही है: GHC 8.0.2 पर काम करने के इस उदाहरण के लिए आप अंडरस्कोर जनरेटर को जोड़ने के लिए, इस तरह की आवश्यकता होगी https://ghc.haskell.org/trac/ghc/ticket/12666

+0

ओह वाह, मैं हैरान हूं यह देखने के लिए कि 'आवेदनकर्ता' ने इस स्पष्ट मामले को संभाला नहीं है! –

+0

'आवेदक डू 'काफी गूंगा है। जैसे यह – luqui

+0

किसी भी प्रकार के 'लेट' स्टेटमेंट को संभाल नहीं सकता है, मुझे एक ही समस्या थी: http://stackoverflow.com/questions/41210599/applicativedo-not-working-with-sequencing – danidiaz

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