2011-12-06 66 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