1

私はこのページ http://book.realworldhaskell.org/read/using-parsec.htmlで作業しており、CSVファイルパーサーを機能させようとしていますが、気づいた

parse csvFile "(stdin)" str

常に a を返します

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

ありがとうございました

4

1 に答える 1

2

これはRight ...単に、操作にエラーがあった可能性があることを意味します。caseステートメントを使用してこれに対処できます。

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

全体のEither設計パターンにより、コード内の任意のエラーをうまく処理できます。好きなようにエラーに対処することができ、Haskeller が嫌う実行時例外について心配する必要はありません。

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

于 2011-12-06T23:15:37.457 に答える