Haskell类型与csv解析不匹配
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Haskell类型与csv解析不匹配相关的知识,希望对你有一定的参考价值。
我正在尝试解析一个csv文件,我想忽略第一行和最后一行,如:
Someheader
foo, 1000,
bah, 2000,
somefooter
我用cassava库写了一些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?任何帮助,感激不尽。
答案
decode
的FromRecord a => HasHeader -> ByteString-> Either String (Vector a)
类型基于documentation的木薯。
所以正确的模式将是Right v
而不是Right (_, v)
。
代码中的另一个问题是,length
是一个函数,并且你没有将它应用于任何东西,在守卫| length == 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)
以上是关于Haskell类型与csv解析不匹配的主要内容,如果未能解决你的问题,请参考以下文章
Haskell 无法将预期类型“[(Char,b0)]”与实际类型“(Char,Int)”匹配