2011-12-06 67 views
1

香港专业教育学院一直与这个页面 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 

谢谢

+0

但是,你将如何做错误处理?如果输入无法解析,那么你的程序崩溃了吗? – hugomg

+2

你知道你可以将这个值'Right [[...],[]]'转换成列表清单:'[[...],[......]] - 你不是吗? ?你可以使用[或](http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v:either)funciton,如果你想要'(错误。显示)编号(parseCSV输入)' –

+1

我不知道,谢谢:)我得到它的工作。 – DustBunny

回答

2

Right ...只是意味着该操作可能有错误。你可以处理这个使用case声明:

case parse csvFile "(stdin)" str of 
    Left err -> handle err 
    Right res -> doStuff res 

整个Either设计模式可以让你在你的代码在处理一个很好的方式任意错误。无论你喜欢什么,你都可以处理这个错误,而且你不必担心Haskellers讨厌的运行时异常。

正如托马斯在评论中指出的那样,您还可以使用either函数来做与case语句相同的事情。

+0

我曾尝试过使用类似的东西,但由于某种原因无法使用它。我在我的代码案例中使用它来加载,所以在案例开关中有一个案例切换。并为右侧res - > mainLoop res。这没有用。 – DustBunny

+0

这听起来像是你在case语句中犯了某种语法错误。错误信息是什么? –

+0

我现在不记得了,我继续使用代码,谢谢你:) – DustBunny