2017-01-19 9 views
0

だから私はから(CSVファイルのためにとHaskellのエラー

table' <- parseCSVFromFile filepath 

が、と私は手でファイルを結合してのだ機能をテスト全体のユーティリティ機能の小さなtoyboxを書いていましたText.CSV

parseCSVFromFile :: FilePath -> IO (Either parsec-3.1.9:Text.Parsec.Error.ParseError CSV) 

ので、私は、このエラーのcsvがらくた

stripBare csv = head $ rights $ flip (:) [] csv 
のいずれかを取り除くために迅速な行を書かなければなりませんでした

とし、table = stripBare table'と再定義してください。この後、リスト機能は、CSVファイルの内容で作業して人生は

に行く(余談:驚くべきことにData.Eitherでの直接Either a b -> b機能がないので、私はData.Either.rights :: [Either a b] -> [b]使用。)

私はの仕事をやってみたかったですcsvのタイプを解き、ワンショットでハンドルにバインドします。私はdoが欠落することができると言って

table = stripBare $ table' <- parseCSVFromFile filepath 

が、これは(<-)の解析エラーを与えるようなものが...その後

table = stripBare $ do table' <- parseCSVFromFile filepath 

があることdoブロック必見の最後の文を言って私に叫びます表現である。

私は間違っていますか?別の好奇心として

、私は

は非常に単純な方法でHaskellのdesugarsに表記を行うことをhereを見ました。

do 
    x <- foo 
    e1 
    e2 
    ... 

は、私は、これは魅力的見つける

foo >>= \x -> 
do 
    e1 
    e2 

になり、

head $ rights $ flip (:) [] csv 

は危険であるような私に型エラー

*Toy> :type (parseCSVFromFile "~/.csv") >>= \x -> x 

<interactive>:1:52: error: 
    * Couldn't match type `Either 
          parsec-3.1.9:Text.Parsec.Error.ParseError' 
        with `IO' 
     Expected type: IO CSV 
     Actual type: Either parsec-3.1.9:Text.Parsec.Error.ParseError CSV 
    * In the expression: x 
     In the second argument of `(>>=)', namely `\ x -> x' 
     In the expression: 
     (parseCSVFromFile "~/.csv") >>= \ x -> x 
+1

「どちらかb→b」が存在しないことは驚くことではない。あなたが 'a'を持っていても' b'がない場合は 'b'を作りますか? – molbdnilo

+0

ああ、そうです。 @molbdniloの不在を許すリスト – Tshimanga

答えて

0

コードを与えた次の行を試してみました。あなたはheadの偏執性を利用して、csvLeft somethingかもしれないという事実を隠しています。私たちは、通常、それがdo IOブロックに直接Leftケースを処理する方が良いでしょう

= head $ rights $ (:) csv [] 
= head $ rights [csv] 
= case csv of 
    Left _ -> error "Left found!" 
    Right x -> x 

としてそれを書き換えることができます。何かのような:(擬似コードが続く)

foo :: String -> IO() 
foo filepath = do 
    table' <- parseCSVFromFile filepath 
    case table' of 
     Left err -> do 
     putStrLn "Error in parsing CSV" 
     print err 
     moreErrorHandlingHere 
     Right table -> do 
     putStrLn "CSV loaded!" 
     use table