1
私はmegaparsecの小さなパーサ書いた:megaparsecの結果と一致させるには?
sc
とシンボルと
semiParser
はチュートリアルからです
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"
を。今、私は私の結果で作業したいと思いますが、私は型エラーを取得:
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
照合し、エラーメッセージまたは結果を得るのですか?
この質問の一般的な形は次のとおりです。パターンマッチングはどのように機能しますか?そして私はモナドの結果をどのようにバインドすることができるのか一般的には混乱しています(IO
のような別のモナドのEither
など)(私はパターンマッチングしてからモナドのコンテキストに値を持ち上げなければならないと思います)
を ''試してみてください - 。> TABLE'' –