2011-12-06 10 views
1

アイブ氏は、このページ http://book.realworldhaskell.org/read/using-parsec.html と協力して、私は、CSVファイルパーサーの作業を取得しようとしているが、私はHaskellのParsecの機能

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)機能を使うことができます。 id(parseCSV入力) ' –

+1

私はそれを知らなかった、ありがとう:)私はそれが働くようになった。 – DustBunny

答えて

2

Right ...ありがとうは単に操作がエラーを持っていたことを意味します。あなたはcase文を使用してこの問題に対処することができます

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

全体Eitherデザインパターンは、あなたが素敵な方法であなたのコード内の任意のエラーを処理することができます。しかし、あなたが好きなエラーに対処することができますし、Haskellersが嫌うランタイム例外を心配する必要はありません。

Thomasがコメントの中で指摘したように、either関数を使用してcase文と同じことを行うこともできます。

+0

私はそのようなものを使用しようとしましたが、何らかの理由で動作させることができませんでした。私はロードのために私のコードケースでそれを使用したので、ケーススイッチ内にケーススイッチがありました。右のres - > mainLoop resを参照してください。これはうまくいきませんでした。 – DustBunny

+0

case文で何らかの構文エラーが発生したようです。エラーメッセージは何でしたか? –

+0

私は今覚えていないと私はコードと一緒に移動、ありがとう:) – DustBunny