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
(我想我有模式匹配,然后提起值放入单子的情况下)。
''现在::头 - > Table'' –