用csv制作木薯名单

时间:2014-11-24 22:06:31

标签: haskell

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的数据放入列表中,然后将其打印出来。

我不理解代码中的lambda表达式p ->

我使用的是自定义数据类型:

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

1 个答案:

答案 0 :(得分:3)

如果将lambda表达式分解为命名函数:

printElement p = putStr $ show (column1 p)

然后你可以把它写成

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

\p -> ...语法是&#34;采用名为p的参数并使用...和#34;进行操作。 V.forM_函数接受一个向量,然后使用monadic函数调用该向量的每个元素,在这种情况下\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