我被建议使用csv-conduit作为一个很好的Haskell包来处理CSV文件.我想学习它是如何工作的,但是文档对于新手Haskell程序员来说太简洁了.
有没有办法让我通过GHCi中的反复试验来弄清楚它是如何工作的?
更具体地说,我应该从 GHCi 加载模块和文件,还是应该编写一个简单的HS文件来加载它们然后以交互方式移动?
我提到了csv-conduit,但是我打开了使用任何 CSV包.我只需要把手放在一边然后愚弄它,直到我感到安心(就像我在IDLE中做的那样).
看看以下功能: readCSVFile :: :: (MonadResource m, CSV ByteString a) => CSVSettings -> FilePath -> m [a]
它的调用相对简单,因为我们只需要一个CSVSettings
,例如defCSVSettings
,和FilePath
(又名String
),"file.csv"
或其他东西.
因此,在通话结束后,我们得到了(MonadResource m, CSV ByteString a)
.我们可以一次解决这个问题,为此找出合适的类型.我们正在执行IO
此操作,因此MonadResource m
,m
应该只是ResourceT IO
,它恰好是MonadBaseControl IO
所需的实例runResourceT
.这是conduit
具体的事情.
对于CSV ByteString a
,我们需要找到什么实例CSV
.为此,请访问http://hackage.haskell.org/packages/archive/csv-conduit/0.2.1.1/doc/html/Data-CSV-Conduit.html#t:CSV(包的文档)在我看来有点令人讨厌的所有填充到类型类... ...并单击Instances以查看我们的表单可用实例CSV ByteString a
.这两个选项是CSV ByteString ByteString
和CSV ByteString Text
.
在这两个中,Text
最好是因为它处理unicode而CSV不太可能包含二进制数据.ByteString
或多或少类似于一段[Word8]
时间Text
更类似于[Char]
你可能想要的.因此,a
应该Text
(虽然ByteString
仍然有效).
这意味着函数调用的结果是ResourceT IO [Row Text]
.我们对此无能为力,但由于ResourceT
是monad变换器,我们可以通过该函数轻松地"弹出"monad变换层runResourceT
.从而,
readFile :: FilePath -> IO [Row Text]
readFile = runResourceT . readCSVFile defCSVSettings
Run Code Online (Sandbox Code Playgroud)
这可以很容易地在主要内部使用,[Row Text]
然后可以使用a map
或a fold
来迭代,以获得单独的行.
要在GHCI中运行此类操作,您必须明确指出类型.原因是结果类实例不依赖于任何参数; 因此,对于任何一组CSVSettings
和FilePath
,readCSVFile
可以返回任意数量的不同类型,只要它们m
是实例MonadResource m
并且a
是实例CSV ByteString a
.因此,我们必须明确指出GHCi您想要哪种类型.
归档时间: |
|
查看次数: |
729 次 |
最近记录: |