簡體   English   中英

在Haskell中使用Cassava解析文件時創建列表

[英]Creating a list when parsing a file using Cassava in Haskell

我可以使用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,我正在做一些無可救葯的傻事......

我正在做一些無可救葯的傻事......

是的,但不要擔心!

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

這樣您就可以將純粹的“let”部分與不純的裝載部分分開。 這不是代碼審查(如果你在那里問我,我可能會詳細說明),但我將處理類型為String -> 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

這應該工作,因為如何構造EitherFunctor實例


哦,還可以使用Control.Applicative獲得獎勵樣式點:

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

(如果您不理解該示例, (<$>)是中綴fmap ,但這不是非常必要的;因此獎金

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM