2014-11-24 52 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制作木薯列表

我不明白代码中的lambda表达式p ->

我使用自定义数据类型:

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

回答

3

如果分解出的是lambda表达式来命名函数:

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每个元素在向量中,然后将该结果转换为正常的Haskell列表。


您的记录转换成列表,你会想要写自己的toList功能:

valuesToList :: Values -> [Int] 
valuesToList (Values c1 c2) = [c1, c2] 

注意,这仅是可能的,如果你的记录是均匀的,所以你可以有一个StringFloat字段混合在这里,因为Haskell列表不能包含不同类型的值。

然后,你可以简单地做

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

,如果我有什么更多的列? – letsjak 2014-11-24 22:38:49

+0

@letsjak你想用这些列做什么? – bheklilr 2014-11-24 22:39:22

+0

将每个csv行放在列表中,像'[column1,column2,...]' – letsjak 2014-11-24 22:40:10