我被建议使用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 次 |
| 最近记录: |