그래서에서 (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
"어느 쪽인가 b → b"가 존재하지 않는 것은 놀라운 일이 아닙니다. 당신은'a'가 있지만'b'가 없다면'b'를 생산합니까? – molbdnilo
아 맞습니다. @molbdnilo 부재로 허용 목록 – Tshimanga