簡體   English   中英

Haskell類型與CSV解析不匹配

[英]Haskell type mismatch with csv parsing

我正在嘗試解析一個csv文件,其中我想忽略第一行和最后一行,如下所示:

Someheader
foo, 1000,
bah, 2000,
somefooter

我使用木薯庫編寫了一些Haskell:

{-# LANGUAGE OverloadedStrings #-}

import Control.Applicative
import qualified Data.ByteString.Lazy as BL
import Data.Csv
import qualified Data.Vector as V
import Control.Monad (mzero)

data Demand = Demand
    { name     :: !String
    , amount   :: !Int
    } deriving Show

instance FromRecord Demand where
    parseRecord r 
         | length == 2 = Demand <$> r .! 0
                                <*> r .! 1
         | otherwise = mzero

main :: IO ()
main = do
    csvData <- BL.readFile "demand.csv"
    case decode HasHeader csvData of
        Left err -> putStrLn err
        Right (_, v) -> V.forM_ v $ \ p ->
            putStrLn $ (name p) ++ " amount " ++ show (amount p)

當我運行此命令時,我發現類型不匹配:

parser.hs:34:15: error:
    • Couldn't match expected type ‘V.Vector a2’
                  with actual type ‘(a1, V.Vector Demand)’
    • In the pattern: (_, v)
      In the pattern: Right (_, v)

我的猜測是我沒有正確地將Vector中的Vector解壓縮嗎? 任何幫助,感激不盡。

根據木薯的文檔decode的類型為FromRecord a => HasHeader -> ByteString-> Either String (Vector a)
因此正確的模式應該是Right v而不是Right (_, v)

在代碼中的另一個問題是, length是一個函數,而你沒有把它應用到任何東西,在中后衛| length == 2 = ... | length == 2 = ... 我相信正確的代碼應該改為| length r == 2 = ... | length r == 2 = ...

這些更改后的完整代碼如下:

{-# LANGUAGE OverloadedStrings #-}

import Control.Applicative
import qualified Data.ByteString.Lazy as BL
import Data.Csv
import qualified Data.Vector as V
import Control.Monad (mzero)

data Demand = Demand
    { name     :: !String
    , amount   :: !Int
    } deriving Show

instance FromRecord Demand where
    parseRecord r 
         | length r == 2 = Demand <$> r .! 0
                                <*> r .! 1
         | otherwise = mzero

main :: IO ()
main = do
    csvData <- BL.readFile "demand.csv"
    case decode HasHeader csvData of
        Left err -> putStrLn err
        Right v -> V.forM_ v $ \ p ->
            putStrLn $ (name p) ++ " amount " ++ show (amount p)

暫無
暫無

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

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