2014-11-24 2 views
1
main :: IO() 
main = do 
    let list = [] 
    csvData <- BL.readFile "data.csv" 
    case decodeByName csvData of 
     Left err -> putStrLn err 
     Right (_, v) -> V.forM_ v $ \ p -> putStr $ show (column1 p) 

나는 CSV 파일에서 데이터를 읽고 그것을 인쇄 할 수있었습니다. 대신에 먼저 벡터 V.forM_ v의 데이터를 목록에 넣은 다음 인쇄하고 싶습니다.CSV에서 카사바 목록 만들기

코드에서 람다 식 p ->을 이해하지 못합니다.

data Values = Values 
    { 
     column1 :: !Int, 
     column2 :: !Int 
    } 

답변

3

이름이 지정된 함수를 람다 표현식 것을 고려하는 경우 :

printElement p = putStr $ show (column1 p) 

는 그런 다음

Right (_, v) -> V.forM_ v printElement 
로 쓸 수

나는 사용자 정의 데이터 형식을 사용하고 있습니다

\p -> ... 구문은 "p이라는 인수를 취하고를 수행합니다."이라고 표시됩니다. V.forM_ 함수는 벡터를 취하고 그 벡터의 각 요소를 호출하는 모나 딕 함수를 취합니다.이 경우 \p -> putStr $ show (column1 p)forM_에 주어진 함수입니다. 당신이 column1 모든 값의 목록을 만들고 싶어 아닌 경우

, 당신은

Right (_, v) -> print $ V.toList $ V.map column1 v 

V.toList $ V.map column1 v 당신이 그것을 각 요소에 대한 column1을 계산합니다, 여기에 관심이 무엇을 할 수 벡터에서 그 결과를 일반 하스켈 목록으로 변환하십시오.


은 당신이 당신의 자신의 toList 함수를 작성하는 것이 좋습니다,리스트로 기록을 변환하려면

귀하의 기록이 균일 한 경우에 당신이를 가질 수 있도록이 만 가능한 것이라고
valuesToList :: Values -> [Int] 
valuesToList (Values c1 c2) = [c1, c2] 

주 하스켈 목록에는 다른 유형의 값을 포함 할 수 없기 때문에 String 또는 Float 필드가 여기에 섞여 있습니다.

그럼 당신은 단순히

Right (_, v) -> print $ V.toList $ V.map valuesToList v 
+0

내가 더 열을 어떤이있는 경우 할 수 있습니까? – letsjak

+0

@letsjak 그 열을 가지고 무엇을하고 싶니? – bheklilr

+0

각 csv 행을'[column1, column2, ...] '와 같은 목록에 넣으십시오. – letsjak