GHCi中的Haskell csv-conduit

CHM*_*CHM 5 csv haskell

我被建议使用csv-conduit作为一个很好的Haskell包来处理CSV文件.我想学习它是如何工作的,但是文档对于新手Haskell程序员来说太简洁了.

有没有办法让我通过GHCi中的反复试验来弄清楚它是如何工作的?

更具体地说,我应该 GHCi 加载模块和文件,还是应该编写一个简单的HS文件来加载它们然后以交互方式移动?


我提到了csv-conduit,但是我打开了使用任何 CSV包.我只需要把手放在一边然后愚弄它,直到我感到安心(就像我在IDLE中做的那样).

alt*_*ive 5

看看以下功能: 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 ByteStringCSV 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中运行此类操作,您必须明确指出类型.原因是结果类实例不依赖于任何参数; 因此,对于任何一组CSVSettingsFilePath,readCSVFile可以返回任意数量的不同类型,只要它们m是实例MonadResource m并且a是实例CSV ByteString a.因此,我们必须明确指出GHCi您想要哪种类型.


iba*_*bab 2

您尝试过Text.CSV吗?如果您刚刚开始使用 Haskell,它可能更合适,因为它要简单得多。至于探索新模块,您只需将其加载到GHCi中即可,无需编写额外的文件。