2017-03-07 79 views
1

我写了一个小解析器与百万秒差距:如何匹配megaparsec结果?

module App (main) where 

import Control.Monad (void) 
import Text.Megaparsec 
import Text.Megaparsec.String 
import qualified Text.Megaparsec.Lexer as L 

sc :: Parser() 
sc = L.space (void spaceChar) lineCmnt blockCmnt 
    where lineCmnt = L.skipLineComment "//" 
     blockCmnt = L.skipBlockComment "/*" "*/" 

symbol :: String -> Parser String 
symbol = L.symbol sc 

semiParser :: Parser String 
semiParser = symbol ";" 

main :: IO() 
main = do 
    input <- getLine 
    case parse semiParser input of 
    Left val -> putStrLn $ "Failed! " 
    Right val -> putStrLn $ "Passed! " 
    print "Done" 

其中sc和符号和semiParser来自教程。现在我想用我的结果工作,但我得到一个错误类型:

App.hs:23:5: error: 
    • Couldn't match expected type ‘String 
            -> Either (ParseError (Token String) Dec) String’ 
        with actual type ‘Either t0 t1’ 
    • In the pattern: Left val 
     In a case alternative: Left val -> putStrLn $ "Failed! " 
     In a stmt of a 'do' block: 
     case parse semiParser input of { 
      Left val -> putStrLn $ "Failed! " 
      Right val -> putStrLn $ "Passed! " } 

App.hs:24:5: error: 
    • Couldn't match expected type ‘String 
            -> Either (ParseError (Token String) Dec) String’ 
        with actual type ‘Either t2 t3’ 
    • In the pattern: Right val 
     In a case alternative: Right val -> putStrLn $ "Passed! " 
     In a stmt of a 'do' block: 
     case parse semiParser input of { 
      Left val -> putStrLn $ "Failed! " 
      Right val -> putStrLn $ "Passed! " } 

所以,我的问题是:我怎么对阵String -> Either (ParseError (Token String) Dec) String并获得错误信息或结果,如果解析失败?

我想这个问题的一般形式是:模式匹配如何工作?我很困惑,一般我怎么能一个单子的结果结合(如在另一个单子Either,如IO(我想我有模式匹配,然后提起值放入单子的情况下)。

回答

0
parse :: Stream s Identity t => Parsec s() a -> SourceName -> s -> Either ParseError a 
               -- ^^^^^^^^^^ -- 

你忘了这样的说法尝试

case parse semiParser "input name here" input of 
+0

''现在::头 - > Table'' –