2017-01-19 10 views
0

그래서에서 (CSV 파일과하스켈 오류

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 형식의 옷을 벗고 한 번에 핸들에 바인딩합니다.

table = stripBare $ table' <- parseCSVFromFile filepath 

같은 뭔가하지만이 말을 나에 구문 분석 오류 (<-) 다음 ... 나는 do 누락 될 수 있다는

table = stripBare $ do table' <- parseCSVFromFile filepath 

을 고함 제공하는 do 블록의 마지막 문장해야 표현이 되라.

내가 뭘 잘못하고 있니?

은 별도의 호기심, 나는

하스켈의 표기는 매우 간단한 방법으로 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 일 수 있다는 사실을 숨 깁니다. 우리는

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

보통은 do IO 블록에 직접 Left 경우를 처리하는 것이 좋습니다로 다시 작성할 수 있습니다. 다음과 같은 것 : (의사 코드가 뒤 따름)

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