首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell Parsec功能

Haskell Parsec功能
EN

Stack Overflow用户
提问于 2011-12-07 06:49:30
回答 1查看 297关注 0票数 1

我一直在使用这个页面http://book.realworldhaskell.org/read/using-parsec.html,我正在尝试让CSV文件解析器工作,但我注意到

代码语言:javascript
复制
parse csvFile "(stdin)" str

总是返回一个

代码语言:javascript
复制
Right [["s","o"],["h","i"]]

有没有一种方法可以让解析器只返回我稍后可以在代码中使用的数组数组?

例如,代码:

代码语言:javascript
复制
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

谢谢

EN

回答 1

Stack Overflow用户

发布于 2011-12-07 07:15:37

Right ...只是意味着操作可能有错误。您可以使用case语句来处理此问题:

代码语言:javascript
复制
case parse csvFile "(stdin)" str of
  Left  err -> handle err
  Right res -> doStuff res

整个Either设计模式让您可以很好地处理代码中的任意错误。您可以随心所欲地处理错误,并且不必担心运行时异常,而这正是Haskellers所讨厌的。

正如Thomas在注释中很有帮助地指出的那样,您还可以使用either函数来执行与case语句相同的操作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8408028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档