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
}
答案 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]
请注意,只有当您的记录是同质的时才可以这样做,因此您可以在此处混合String
或Float
字段,因为Haskell列表不能包含不同类型的值。
然后你可以简单地做
Right (_, v) -> print $ V.toList $ V.map valuesToList v