[英]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.