【问题标题】:Creating a list when parsing a file using Cassava in Haskell在 Haskell 中使用 Cassava 解析文件时创建列表
【发布时间】:2023-03-31 06:52:02
【问题描述】:

我可以使用 Data.Csv 中的以下代码解析我的 csv 文件:

valuesToList :: Foo -> (Int, Int)
valuesToList (Foo a b) = (a,b)

loadMyData :: IO ()
loadMyData = do
  csvData <- BL.readFile "mydata.csv"
  case decodeByName csvData of
        Left err -> putStrLn err 
        Right (_, v) -> print $ V.toList $ V.map valuesToList v

当我运行它时,我会在屏幕上得到正确的输出。我的问题是我不清楚如何创建一个纯函数,以便我可以使用列表的内容,如:

let l = loadMyData

其中 l 的类型是 [Int,Int] 我猜是因为我在 IO Monad 中,我正在做一些无可救药的傻事......

【问题讨论】:

    标签: csv haskell


    【解决方案1】:

    我正在做一些无可救药的傻事......

    是的,但不要担心!

    loadMyData = BL.readFile "mydata.csv"
    
    processMyData :: String -> String
    processMyData csvData = 
      case decodeByName csvData of
            Left err -> err 
            Right (_, v) -> show $ V.toList $ V.map valuesToList v
    
    main = do
        csv <- loadMyData
        let output = processMyData csv
        print output
    

    通过这种方式,您可以将纯的“让”部分与不纯的加载部分分开。这不是代码审查(如果你在那里问,我可能会详细说明),但我会将处理输入为String -&gt; Either String [Int, Int] 或其他内容,并将失败信息保留在类型系统中。

    processMyData csvData = 
      case decodeByName csvData of
            Left err -> Left err 
            Right (_, v) -> Right $ V.toList $ V.map valuesToList v
    

    而这反过来可能只是(如果我在某个地方犯了错误,请原谅我,我正在现场进行):

    processMyData = fmap (V.toList . V.map valuesToList) . decodeByName
    

    这应该可以工作,因为 how the Functor instance for Either 是构造的。


    哦,还可以使用Control.Applicative 来获得奖励样式积分:

    main = do
        output <- processMyData <$> loadMyData
        print output
    

    (如果您不理解该示例,(&lt;$&gt;) 是中缀 fmap,但这不是绝对必要的;因此 奖励

    【讨论】:

    • 所以现在编译器给了我这个:Could't match type BL.ByteString' with [Char]' 预期类型:String 实际类型:BL.ByteString 在processMyData', namely csv'的第一个参数中表达式:processMyData csv 在“输出”等式中:输出 = processMyData csv
    • @AnthonyW 对于我可能犯的任何错误,我深表歉意。不过,这应该足以让您正常工作
    • 是的。 processMyData 的签名类型是 ByteString -> String
    • 我想得到 ByteString -> [(Int,Int)]
    • @AnthonyW You might find this useful。很抱歉昨天没有来帮助你,我刚好有足够的时间来写答案。如果您已经解决(或将来设法解决问题),请编辑我的答案或添加您自己的答案!
    猜你喜欢
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 1970-01-01
    相关资源
    最近更新 更多