我一直在使用这个页面http://book.realworldhaskell.org/read/using-parsec.html,我正在尝试让CSV文件解析器工作,但我注意到
parse csvFile "(stdin)" str总是返回一个
Right [["s","o"],["h","i"]]有没有一种方法可以让解析器只返回我稍后可以在代码中使用的数组数组?
例如,代码:
main = mainLoop []
mainLoop :: [[String]] -> IO ()
mainLoop db = do
answer <- getLine
case words answer of
("load":x) -> do
str <- readFile (head x)
mainLoop $ parseCSV str
("quit":_) -> return ()
("help":_) -> do
putStrLn "This is your help"
mainLoop db
otherwise -> putStrLn "Not sure what you want me to do! :(" >> mainLoop db
csvFile = endBy line eol
line = sepBy cell (char ',')
cell = many (noneOf ",\n")
eol = char '\n'
parseCSV :: String -> Either ParseError [[String]]
parseCSV input = parse csvFile "(unknown)" input谢谢
发布于 2011-12-07 07:15:37
Right ...只是意味着操作可能有错误。您可以使用case语句来处理此问题:
case parse csvFile "(stdin)" str of
Left err -> handle err
Right res -> doStuff res整个Either设计模式让您可以很好地处理代码中的任意错误。您可以随心所欲地处理错误,并且不必担心运行时异常,而这正是Haskellers所讨厌的。
正如Thomas在注释中很有帮助地指出的那样,您还可以使用either函数来执行与case语句相同的操作。
https://stackoverflow.com/questions/8408028
复制相似问题